首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

利用元表实现修饰器

这次终于把字体大小弄对了,以前是用rem(相对文档大小)做单位的,在一部分手机上会出现字体偏大的现象,现在改用em做单位,应该没事了,如果还有问题只能用终极武器px了

基础概念

元表(metatable)

弱表(weak table)

运算符重载

修饰器

概述

有时我们要为一些对象增加元数据(文档,变量类型什么的),但有时对象是从别处来的,没法修改内部,所以要用到修饰器。注:本文的对象指lua中的table,function,userdata等。什么是修饰器?修饰器可以理解成数学中的算子,接受一个函数,返回修饰过的一个函数,例如微分算子

,可以返回函数的导函数。修饰器与它类似,就是接受一个对象,返回修饰过的对象。文档字符串(docstring)用来说明对象的功能,使用方法的一个字符串,随着对象传递,可以使用特定的函数获取该字符串(例如py中的help函数)。利用元表模拟文档修饰器利用lua强大的元表功能,可以很方便的实现修饰器,给对象增加docstring。在lua的中,每一个对象可以用作table的key,也就是所谓的弱表(weak table,具体见《lua程序设计第一版》第十七章 weak 表)。所以只要建立一个全局表,用对应对象做key,来存储每个对象的docstring,就可以了,具体实现:

localdocstrings=setmetatable({}, {__mode="kv"})

functiondocument(str)

returnfunction(obj)docstrings[obj] =str;returnobjend

end

functionhelp(obj)

print(docstrings[obj])

end

document[[Print the documentation for a given object]](help)

document[[Add a string as documentation for an object]](document)

f=document[[Print a hello message]](

function()

print("hello")

end

)

f()

help(f)

代码来自lua-user wiki用运算符重载像下面这个:

random=

docstring[[Compute random number.]]..

typecheck("number",'->',"number") ..

function(n)

returnmath.random(n)

end重载了运算符,为什么要这样?这样就可以省去一对括号,让人看不出docstring是一个函数= =可以用下列代码实现:

mt= {__concat=

function(a,f)

returnfunction(...)

print("decorator",table.concat(a,","), ...)

returnf(...)

end

end

}

functiontypecheck(...)

returnsetmetatable({...},mt)

end

functiondocstring(...)

returnsetmetatable({...},mt)

endbtw,除了运算符,你也可以重载别的,反正看起来好看就行。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180418G1P45200?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券