Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用(类似)索引扩展lua元表_Lua - Fatal编程技术网

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

如何使用(类似)索引扩展lua元表,lua,Lua,下面的课程展示了我所尝试的内容。我一定是误读了一些文档,它们(我想)说,当元表中的_索引项没有为该键提供项时,该表中的_索引项提供了默认值。关键是它对元表本身不起作用,但我不知道为什么不起作用。文档中的什么地方解释了这一点,在这种情况下我能做些什么 谢谢 > a = {} > b = {} > setmetatable(a,b) table: 0000000002631ae0 > c = { __tostring = function(x) return "X&

下面的课程展示了我所尝试的内容。我一定是误读了一些文档,它们(我想)说,当元表中的_索引项没有为该键提供项时,该表中的_索引项提供了默认值。关键是它对元表本身不起作用,但我不知道为什么不起作用。文档中的什么地方解释了这一点,在这种情况下我能做些什么

谢谢

> 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 ?
>

因此,这个问题并不特定于打印和tostring。当然,在实际情况中,我希望有许多不同的对象共享许多元表值,而不必每次都复制所有内容…

这是因为
\uu index
与索引操作相关,如
tbl.var
。Lua不使用
\uuuu index
来获取其他元方法(如
\uuuu-tostring

您使用的是直接从元表调用
\uuuuu tostring
print
,这里不使用
\uu index

__索引:索引访问操作表[键]

了解更多信息:

解决方案是将元表
c
b
合并

setmetatable(b,{{uuuuuuToString=c.{uuuuuuToString})
打印(b)--X

我不知道tbl.var在哪里被描述。但这并不特定于打印和粘贴。我添加了另一个例子…@SadieKaye好的,稍加修改,Lua不使用_索引来获取其他元方法。这会影响到uuuu-tostring、uuuu-add、uuuu-sub、uuuuu-mul、uuuuuuuu-mode、uuuuu-pairs等(所有这些都是),所以问题是。。这个文档记录在哪里?我该怎么办?@SadieKaye它没有具体记录,但它提到了何时调用索引。>__索引:索引访问操作“表[键]”@SadieKaye:它是有文档记录的。“Lua使用原始访问权查询元表中的元方法(请参阅rawget)。”