我开始在Lua学习基于Prototype的编程。我想知道没有metamethods的metatables的用法是什么。当我删除此行时, self .__ index = self 下面有一行 somevalue 在我的新对象中不可见这是正常的,因为我没有使用metamethod __指数。那么metatables的用法是什么 - 仅使用metamethods?对不起琐碎的问题,但这真的很有趣,我知道我可以使用getmetatable来检查某些对象的元表。我需要一个简单的答案:没有metamethods就没有用,或者有(如果是,那么是什么)。
-- Example taken from the official documentation.
Account = { somevalue = 1 }
function Account:new (o)
o = o or {} -- create object if user does not provide one
setmetatable(o, self)
--self.__index = self
return o
end
a = Account:new()
print(a.somevalue) -- nil, so I can't use any features of the metatable till I use some metamethod?
答案 0 :(得分:4)
根据定义,metatables存储metamethods。这并不意味着metatable必须只存储 元方法;几个图书馆将自己用作元图。
metatable是一个普通的Lua表。当你用它作为第二个参数调用setmetatable
时,它只会成为对象的元表。
答案 1 :(得分:3)
您还可以使用__mode
metatable键创建键或值,或者两者都是弱的,它采用字符串值而不是函数(方法)
大多数元方法都在这里解释:
一些Lua API函数还测试特定的元方法,例如
__pairs
- for pairs()__ipairs
- 适用于ipairs()__tostring
- 由tostring()函数调用__gc
- 用于垃圾收集__metatable
- 由set / getmetatable函数(也是值)读取如果您在manual文件中搜索包含__
的特定名称,您将找到完整的定义和说明,此处不再重复使用。
答案 2 :(得分:1)
嗯,是的,metatables存储了对象的元方法,这就是它们的用途,至少我还没有看到任何其他用例。