接触lua时间不短了,但每隔一段时间不用,就感觉有点陌生。
元表我记得我也看过,但让我现在说是什么,我也说不清楚,所以我又回去认真复习了一下。
用一句通俗的话来形容
如果用一句通俗的话来形容的话,
我觉得,元表是为了扩展table的功能!让table更强大!
这就很好理解了,很通俗,没有专业术语。
能说出通俗的解释,
- 一方面说明我思考了,只要思考了就可以加深印象,
- 另一方面说明自己对这个东西有了一些了解,不然说不出来。
(如果我说得不对,还请指正)
多思考这个东西的本质
学一个新东西的时候,可以去想:
- 这个东西解决了什么问题?
- 可以实现什么功能?
- 实现同样的功能可以使用其它更简单的方法吗?
- 所实现的功能重要吗?可替代吗?
通过这么一番思考
- 会对所学的东西有个更清晰的认识,
- 会更清楚这个东西重要不重要,
- 什么时候重要
- 什么时候用
- ....
意识到重要性了,自然会引起大脑的重视,印象更深刻,有利于自己灵活使用。
来个元表的例子
mytable = {}
metatable = {
__index = function(_, name)
print("不存在key"..name)
end
}
setmetatable(mytable, metatable)
print(mytable.var1)
首先声明了两个表,一个叫mytable
,另一个叫metatable
如果我访问mytable中的一个key,这个key不存在,那我会得到一个nil值。
我想给mytable添加一个功能,当我访问不存在的key时,给我输出提示,怎么做呢?
这时就会用到元表了,
通过setmetatable
方法,给mytable设置一个元表(metatable),就好像给mytable装了个胳膊,让mytable拥有了metatable的功能。
可以看到metatable里有个函数,其功能就是输出"不存在某key"的提示。
但还有一个东西,__index
这是什么?
这叫元方法,看看文档怎么定义的:
__index: 索引 table[key]。 当 table 不是表或是表 table 中不存在 key 这个键时,这个事件被触发。 此时,会读出 table 相应的元方法。
所以当我们在mytable中访问不存在的key时,就会触发这个元方法。
这样通过元表和元方法就实现了给表扩展功能的目的。
更多元方法可以看lua文档
具体通过元表可以实现哪些实用的功能,可以找些lua项目源码看看。
网友评论