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
Lua metamethod\uuuNewIndex:“当表不是表时会发生此事件”?_Lua - Fatal编程技术网

Lua metamethod\uuuNewIndex:“当表不是表时会发生此事件”?

Lua metamethod\uuuNewIndex:“当表不是表时会发生此事件”?,lua,Lua,本手册中的Lua 5.3参考手册向下滚动显示: __newindex:索引分配表[key]=值。和索引事件一样,当表不是表或表中不存在键时,会发生此事件。元方法在表中查找 然而,我不理解当表不是表时,metamethod\uuuNewIndex会发生。这是什么意思?我确实尝试用nil重新分配一个本地表,但没有成功是的,我知道重新分配表没有意义,但这将有助于垃圾收集 local v = {}; setmetatable(v, { __newindex = function(t,k,v)

本手册中的Lua 5.3参考手册向下滚动显示:

__newindex:索引分配表[key]=值。和索引事件一样,当表不是表或表中不存在键时,会发生此事件。元方法在表中查找

然而,我不理解当表不是表时,metamethod\uuuNewIndex会发生。这是什么意思?我确实尝试用nil重新分配一个本地表,但没有成功是的,我知道重新分配表没有意义,但这将有助于垃圾收集

local v = {};

setmetatable(v, {
    __newindex = function(t,k,v)
        print("Aaahhh...!");
    end
});

v = nil;

我用这个来测试它。

从您引用的页面:

可以使用setmetatable替换表的metatable 作用不能从Lua代码更改其他类型的元表 除非使用调试库§6.10;您应该使用C API 为此

无法使用setmetatable更改非表的图元,因此无法验证在索引到非表的对象时调用_newindex方法的预期效果

代码运行是因为您正在为表设置元表。本地v={}创建一个表

但是,将变量v重新指定为其他变量意味着您无法再访问您创建的表。如果您的最后一行是v[5]=“Hello”,那么您将看到您的元方法被调用

编辑

在阅读编辑时,您是否希望在垃圾收集表时调用\uuuuNewIndex?我认为您误解了当table不是表时调用_unewindex的说法。这意味着如果你做了这样的事情:

local v = 5
print(v[3]) -- indexing into something that's not a table

__将调用newindex,因为在表达式表[key]中,这里是v[3],表不是表。但是您不能通过setmetatable方法实际设置新索引,因为该方法仅适用于表。

从您引用的页面:

可以使用setmetatable替换表的metatable 作用不能从Lua代码更改其他类型的元表 除非使用调试库§6.10;您应该使用C API 为此

无法使用setmetatable更改非表的图元,因此无法验证在索引到非表的对象时调用_newindex方法的预期效果

代码运行是因为您正在为表设置元表。本地v={}创建一个表

但是,将变量v重新指定为其他变量意味着您无法再访问您创建的表。如果您的最后一行是v[5]=“Hello”,那么您将看到您的元方法被调用

编辑

在阅读编辑时,您是否希望在垃圾收集表时调用\uuuuNewIndex?我认为您误解了当table不是表时调用_unewindex的说法。这意味着如果你做了这样的事情:

local v = 5
print(v[3]) -- indexing into something that's not a table

__将调用newindex,因为在表达式表[key]中,这里是v[3],表不是表。但是你不能通过setmetatable方法设置新索引,因为该方法只对表有效。

这很有帮助,自从我开始学习元表以来,我一直认为不可能为其他值类型设置元表,但是为什么Lua接受其他值类型的metamethod u_newindex?Lua非常关注嵌入用例,所以我怀疑这里的灵活性是确保当通过C接口嵌入Lua时,您可以创建类似表的东西来支持索引,而实际上不是Lua表。这很有帮助,自从我开始学习元表以来,我一直认为不可能为其他值类型设置元表,但是为什么Lua接受其他值类型的元方法uu newindex?Lua非常关注嵌入用例,所以我怀疑这里的灵活性是确保在通过C接口嵌入Lua时,您可以创建类似于表的支持索引的东西,而这些东西实际上不是Lua表。除了当前的答案之外,还应该注意,您还可以为其他值设置元表。setmetatable可以将其设置为表或用户数据。debug.setmetatable可以设置一个应用于不同数据类型的每个值的元表。这就是“非表”的意思:@warspy这意味着Lua上的每个值类型都是对象?谢谢你的帮助!在你的评论和smarx的回答的帮助下,我现在明白了。答案中应该注意到这一点。不是所有的值都是对象!一点也不。例如,如果将元表设置为1,则所有数字都将具有该数据类型。只有表和用户数据是对象。@warspyking我明白了,这很简单!我把你在行动中说的话编了一段代码。。。它就像一个原型…除了当前的答案,应该注意的是,您还可以为其他值设置元表。
setmetatable可以将其设置为表或用户数据。debug.setmetatable可以设置一个应用于不同数据类型的每个值的元表。这就是“非表”的意思:@warspy这意味着Lua上的每个值类型都是对象?谢谢你的帮助!在你的评论和smarx的回答的帮助下,我现在明白了。答案中应该注意到这一点。不是所有的值都是对象!一点也不。例如,如果将元表设置为1,则所有数字都将具有该数据类型。只有表和用户数据是对象。@warspyking我明白了,这很简单!我把你在行动中说的话编了一段代码。。。它就像一个原型。。。