[英]how to extend lua metatables with (something like) __index
以下会话显示了我正在尝试的内容。 我一定在某处误读了一些文档,(我认为)说元表中的 __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 的。 当然,在实际情况下,我希望许多不同的对象共享许多元表值,而不必每次都复制所有内容......
这是因为__index
与tbl.var
等索引操作tbl.var
。 Lua 不使用__index
来获取其他元方法(如__tostring
)。
您正在使用print
直接从元表调用__tostring
,它在这里不使用__index
。
__index:索引访问操作表[key]
解决方案是将元表c
与b
合并。
setmetatable(b,{ __tostring = c.__tostring })
print(b) -- X
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.