我正在学习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 安德森格林在评论中建议的那样。