Lua 构造函数参数的困惑

我正在遵循这个例子 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')
-- 输出
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, }

我感到困惑的是:为什么第一个使用 .new 时,在执行 getmetadata(arg1) 时提供了元数据。为什么参数这里有元数据?这是因为 Class.new 中的第一个实参实际上是 self 吗?

点赞
用户734069
用户734069

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

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

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

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

2019-09-13 16:58:27