setmetatable()如何工作以及为什么在lua的链表中需要metatable

时间:2014-12-12 04:32:29

标签: lua lua-table metatable meta-method

我正在学习Lua的元数据如何在OOP中工作,我对从lua-users wiki上的面向对象教程中读取的代码感到困惑。有人可以帮助解释以下问题吗?感谢。

问题1: 维基的解释:这里我们在具有__call元方法的类表中添加一个元表,当一个值被调用为函数时触发。我们将它称为类的构造函数,因此在创建实例时您不需要.new。

(1)如何在示例中调用__call,以便调用构造函数?
(2)" cls"参考" MyClass?"

setmetatable(MyClass, {
  __call = function (cls, ...)
  return cls.new(...)
end,
})

问题2: 以下代码中的{}是什么意思?

function MyClass.new(init)
  local self = setmetatable({}, MyClass)
  self.value = init
  return self
end 

**这是完整的代码:

local MyClass = {}
MyClass.__index = MyClass

setmetatable(MyClass, {
  __call = function (cls, ...)
  return cls.new(...)
end,
})

function MyClass.new(init)
  local self = setmetatable({}, MyClass)
  self.value = init
  return self
end

function MyClass:set_value(newval)
  self.value = newval
end

function MyClass:get_value()
  return self.value
end

local instance = MyClass(5)
-- do stuff with instance...

1 个答案:

答案 0 :(得分:1)

问题1:

setmetatable(MyClass, {
  __call = function (cls, ...)
  return cls.new(...)
end,
})

这将MyClass的metatable设置为一个定义__call元方法的表。因此,您可以“调用”MyClass(newObj = MyClass(<args>))。在metame方法中,cls引用被调用的表,在这种情况下它指的是MyClass。

问题2:

function MyClass.new(init)
  local self = setmetatable({}, MyClass)
  self.value = init
  return self
end

{}是表文字的语法,它创建一个新表(在本例中为空表)。 MyClass表被设置为新表的元表。然后将这个新表分配给自己。

更多关于元数据的信息可以在这里找到:https://www.google.com/?gws_rd=ssl#q=lua+metatables,正如Anderson Green在评论中所建议的那样。