【发布时间】:2020-11-10 18:39:10
【问题描述】:
以下会话显示了我正在尝试的内容。我一定在某处误读了一些文档(我认为),当表没有为该键提供项目时,元表中的 __index 项目提供了默认值。关键是它不适用于元表本身,但我不知道为什么不这样做。文档中的什么地方对此进行了解释,在这种情况下我该怎么办?
谢谢!
> a = {}
> b = {}
> setmetatable(a,b)
table: 0000000002631ae0
> c = { __tostring = function(x) return "X" end }
> setmetatable(b,{ __index=c })
table: 0000000002631560
>
> print(a)
table: 0000000002631ae0
> -- I was expecting: X
> print(getmetatable(a).__tostring)
function: 0000000002633840
> print(tostring(a))
table: 0000000002631ae0
> -- Again, expecting X
> print(getmetatable(a).__tostring(a))
X
>
这是另一个例子。
> a = {}
> b = {}
> setmetatable(a,b)
table: 0000000002631fe0
> c = { __add = function(x,y) return "X" end }
> setmetatable(b,{ __index=c })
table: 00000000026316a0
>
> print(a+a)
stdin:1: attempt to perform arithmetic on a table value (global 'a')
stack traceback:
stdin:1: in main chunk
[C]: in ?
>
所以这个问题不是特定于 print 和 tostring。当然,在实际情况下,我希望有很多不同的对象共享很多元表值,而不必每次都复制所有内容......
【问题讨论】:
标签: lua