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



我正在学习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:

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

这会将 MyClass 的元表设置为定义__call元方法的表。因此,您可以"调用"MyClass ( newObj = MyClass(<args>) )。在元方法中,cls 引用被调用的表,在本例中它引用 MyClass。

问题2:

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

{} 是表文本的语法,用于创建一个新表(在本例中为空表)。MyClass 表被设置为新表的元表。然后将此新表分配给 self。

更多关于元表的信息可以在这里找到:https://www.google.com/?gws_rd=ssl#q=lua+metatables 安德森格林在评论中建议的那样。

最新更新