我正在学习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...
答案 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在评论中所建议的那样。