setmetatable() 如何工作,并且为什么在 lua 中的链表中需要元表。

我正在学习 Lua 的元表在面向对象编程中的作用,我对 Lua-users wiki 上的面向对象教程中的代码感到困惑。有人能帮忙解释以下问题吗?谢谢。

问题1: wiki 的解释:在这里,我们向类表添加一个具有 __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...
点赞
用户2162306
用户2162306

问题1:

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

这将MyClass的元表设置为一个定义了__call元方法的表。因此,您可以通过newObj = MyClass(<args>)调用MyClass。在元方法中,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 ,如评论中的Anderson Green所建议的。

2014-12-14 18:49:21