如何更改Lua中表的长度运算符(#
)?手册建议在元表中分配__len
函数,然后将该元表分配给要覆盖的表,但这并没有按预期工作。我无法在C端覆盖它。
turtles = {1,2,3}
setmetatable(turtles, {__len = function(mytable) return 5 end})
print(#turtles)
--returns 3, should return 5
如何更改Lua中表的长度运算符(#
)?手册建议在元表中分配__len
函数,然后将该元表分配给要覆盖的表,但这并没有按预期工作。我无法在C端覆盖它。
turtles = {1,2,3}
setmetatable(turtles, {__len = function(mytable) return 5 end})
print(#turtles)
--returns 3, should return 5
在Lua 5.2参考手册中,如果操作数是一个表,则检查是否可用"len": the # operation.
function len_event (op) if type(op) == "string" then return strlen(op) -- primitive string length elseif type(op) == "table" then return #op -- primitive table length else local h = metatable(op).__len if h then -- call the handler with the operand return (h(op)) else -- no handler available: default behavior error(···) end end end
__len
元方法。
"len": the # operation.
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
else
中的代码永远不可能被执行。换句话说:虽然此功能的代码存在,但函数似乎编写不当。 - Hatefiendelse
子句经常用于实现userdata的#
运算符。 - negamartin