什么是元数据的使用没有metamethods?

时间:2013-06-26 18:41:49

标签: lua

我开始在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?

3 个答案:

答案 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存储了对象的元方法,这就是它们的用途,至少我还没有看到任何其他用例。