【问题标题】:How does setmetatable() work and why the metatable is needed in the linked list in luasetmetatable() 是如何工作的以及为什么在 lua 的链表中需要元表
【发布时间】:2015-02-10 18:24:50
【问题描述】:

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

【问题讨论】:

标签: lua lua-table metatable meta-method


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

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

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 2020-03-26
    • 2016-08-02
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2016-08-05
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多