Lua表长度函数覆盖不起作用

fis*_*og1 5 lua metatable lua-table

如何#在Lua中更改表的长度operator(),手册建议__len在metatable中分配函数,然后将metatable分配给我想要覆盖的表,但是这不能按预期工作?我没有选择在C端覆盖它.

turtles = {1,2,3}
setmetatable(turtles, {__len = function(mytable) return 5 end})

print(#turtles)
--returns 3, should return 5
Run Code Online (Sandbox Code Playgroud)

Yu *_*Hao 6

你必须使用Lua 5.1.在__len上表元方法,因为Lua的5.2的支持.

Lua 5.1参考手册中,如果操作数是表,则直接返回原始表长度.

"len":#操作.

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
Run Code Online (Sandbox Code Playgroud)

Lua 5.2参考手册中,如果操作数是表,请检查__lenmetamethod是否可用.

"len":#操作.

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
Run Code Online (Sandbox Code Playgroud)