关于元方法的问题

我想重写这段代码

local tb = {}

local meta = {}

function tb.new(b)
local super = {}
super.b = b

setmetatable(super,meta)

return super
end

function tb.add(s1,s2)

return s1.b+s2.b

end

meta.__concat = tb.add

f= tb.new(3)
t= tb.new(4)

print(f..t)

使用 tb = setmetable({},(metamethod) 的方法,我得到了这个结果


 local tb = setmetatable({},{__concat = function(a,b)

return a+b
end
})

function ins(a)

tb.a = a

return tb.a

end

print(ins(2)..ins(3))

我想知道为什么这段代码不工作,我承认我不知道自己在做什么,这篇文章需要多少字啊 ;-;

点赞
用户15878986
用户15878986

如果我理解正确的话,你想要这个。

function tb(b)
    return setmetatable({b = b},{__concat = function(s1,s2)
        return s1.b + s2.b
    end})
end

print(tb(3)..tb(4))
2021-05-09 14:29:17
用户2858170
用户2858170
`print(ins(2)..ins(3))`

解析为

print(2 .. 3)


解析为

print("2" .. "3")


解析为

print("23")

```

输出为 23

两个数字会隐式转换为它们的字符串表示形式,然后它们会被连接成一个字符串 "23"

根据 Lua 5.4 参考手册: 3.4.6 Concatenation

Lua 中的字符串拼接运算符用两个点 ('..') 表示。如果两个操作数都是字符串或数字,则数字会被转换为非指定格式的字符串(参见 §3.4.3)。否则,会调用 __concat 元方法(参见 §2.4)。

你的第一个代码片段连接了两个表,而第二个代码片段连接了两个数字。因此,在第二种情况下,__concat 元方法永远不会被调用。

如果要添加这两个数字,只需使用 print(ins(2) + ins(3))。我不明白为什么要替换简单的算术运算符,这只会增加不必要的混淆。

你需要将 tb 与某些东西连接起来才能调用你的 __concat,而不是连接它的字段。

2021-05-09 16:22:33