繁体   English   中英

如何使用(类似)__index 扩展 lua 元表

[英]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 的。 当然,在实际情况下,我希望许多不同的对象共享许多元表值,而不必每次都复制所有内容......

这是因为__indextbl.var等索引操作tbl.var Lua 不使用__index来获取其他元方法(如__tostring )。

您正在使用print直接从元表调用__tostring ,它在这里不使用__index

__index:索引访问操作表[key]

了解更多: https : //www.lua.org/manual/5.4/manual.html#2.4

解决方案是将元表cb合并。

setmetatable(b,{ __tostring = c.__tostring })
print(b) -- X

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM