一个初学者关于Lua和元数据的问题,一个简单的例子,比如Hello,涉及len事件,不幸的是它没有返回预期的结果(我使用的是从Ubuntu的官方存储库安装的Lua5.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我原以为第一个print语句会显示1,但它会显示0,这让我大吃一惊。
我错过了什么?
根据Lua参考手册- /T1581-1993化学文摘的说法,#相当于:
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似乎是上述工作的必要条件。
发布于 2012-10-07 06:08:38
来自http://lua-users.org/wiki/LuaFaq
为什么__gc和__len元方法不能在表上工作? 计划在5.2中支持表上的
__len。见LuaFiveTwo。
由于您使用的是5.1,所以表上的__len无法工作。实际上,在Lua5.2上运行代码会产生
1
1如预期的那样。
https://stackoverflow.com/questions/12766510
复制相似问题