1

我正在学习 Lua 的元表如何在 OOP 中工作,我对从 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...
4

1 回答 1

2

问题一:

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 表被设置为新表的元表。然后这个新表被分配给自己。

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

于 2014-12-14T18:49:21.930 回答