【问题标题】:Confused about Lua constructor argument对 Lua 构造函数参数感到困惑
【发布时间】:2019-09-13 16:38:37
【问题描述】:

我正在关注这个例子OOP in Lua - Creating a class?

local Class = {}
local Object = {}
Object.__index = Object

function Class.new(arg1)
    print(require('app.utils').asString(arg1))
    print(require('app.utils').asString(getmetatable(arg1)))

    return setmetatable({}, Object)
end
setmetatable(Class, {__call = Class.new})

return Class

我只是在转储第一个参数,这就是我得到的

Class.new('123')
-- prints
123
{ ["__index"] = { ["reverse"] = function: builtin#82,["dump"] = function: builtin#85,["match"] = function: builtin#87,["rep"] = function: builtin#81,["len"] = function: 0x07b63050,["upper"] = function: builtin#84,["format"] = function: builtin#91,["find"] = function: builtin#86,["char"] = function: builtin#79,["sub"] = function: builtin#80,["gsub"] = function: builtin#90,["gmatch"] = function: builtin#89,["lower"] = function: builtin#83,["byte"] = function: builtin#78, } , } 


Class:new('123')
{ ["new"] = function: 0x029dcd08, } 
{ ["__call"] = function: 0x029dcd08, } 

我感到困惑的是,当我使用getmetadata(arg1) 时,第一次使用 cass .new 时如何提供元数据。为什么论点在这里有元数据?是不是因为Class.new 中的第一个参数实际上是self

【问题讨论】:

    标签: lua


    【解决方案1】:

    为什么参数在这里有元数据?

    因为您提供了一个具有元表的对象。

    Lua 中的每个对象都可以有一个元表。这包括字符串。 Lua 标准字符串库将字符串库表设置为字符串元表的__index 元方法。所以('123'):reverse()是合法的。

    这个元表在所有字符串之间共享(而不是每个单独的字符串都有自己的元表),这就是为什么您提供的字符串有一个元表,尽管您没有明确设置一个。但它仍然是一个合法的元表,您可以对其进行查询和操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2015-09-05
      • 1970-01-01
      相关资源
      最近更新 更多