gpt4 book ai didi

lua - 你好元表.__len 世界

转载 作者:行者123 更新时间:2023-12-04 13:46:24 28 4
gpt4 key购买 nike

一个关于Lua和元表的初学者问题,以一个简单的Hello-World为例,涉及len事件,不幸的是它没有返回预期的结果(我使用的是从 Ubuntu 官方存储库安装的 Lua 5.1)。

案子

这是示例:

Test_Type = {};

function Test_Type.__len (o)
return 1;
end;

function new_test ()
local result = {};
setmetatable(result, Test_Type);
return result;
end;

do
local a_test = new_test();
print (#a_test);
print(getmetatable(a_test).__len(a_test));
end;

我得到的结果:
0
1

我期待第一个打印语句显示 1 ,但它显示 0 ,令我大吃一惊。

我错过了什么?

根据 Lua Reference Manual — Metatables and Metamethods , #相当于:
function len_event (op)
if type(op) == "string" then
return strlen(op) -- primitive string length
else
local h = metatable(op).__len
if h then
return (h(op)) -- call handler with the operand
elseif type(op) == "table" then
return #op -- primitive table length
else -- no handler available: error
error(···)
end
end
end

所以 print (#a_test);print(getmetatable(a_test).__len(a_test));结果应该是一样的,不是吗?

顺便说一下,为什么上面摘录的引用手册是指 metatable(op)而它应该是 getmetatable(op) ?至少我试过了 print(metatable(a_test).__len(a_test)); ,并以错误结束。

回答

正如 Nneonneo 注意到的,这是正在使用的 Lua 版本的问题。上面的工作似乎需要Lua 5.2。

最佳答案

来自 http://lua-users.org/wiki/LuaFaq :

Why doesn't the __gc and __len metamethods work on tables?

__len on tables is scheduled to be supported in 5.2. See LuaFiveTwo.


由于您使用的是 5.1, __len在 table 上不起作用。事实上,在 Lua 5.2 上运行你的代码会产生
1
1
正如预期的那样。

关于lua - 你好元表.__len 世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766510/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com