Lua表长度函数覆盖无法正常工作。

如何在Lua中更改表的长度运算符( #),手册建议将 __len 函数赋给元表,然后将该元表分配给要覆盖的表,但是这不像预期的那样起作用吗?我没有选择在C端覆盖此选项。

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

print(#turtles)
--返回3,应返回5
点赞
用户1009479
用户1009479

你必须使用 Lua 5.1。在 Lua 5.2 中支持对表(table)执行 __len 元方法。

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

"len": #操作。

function len_event (op)
   if type(op) == "string" then
     return strlen(op)         --原始字符串长度
   elseif type(op) == "table" then
     return #op                --原始表长度
   else
     local h = metatable(op).__len
     if h then
       --使用操作数调用处理器
       return (h(op))
     else  --没有可用的处理器:默认行为
       error(···)
     end
   end
 end

Lua 5.2 参考手册中,如果操作数是一个表,则检查是否可用 __len 元方法。

"len": #操作。

function len_event (op)
   if type(op) == "string" then
     return strlen(op)      --原始字符串长度
   else
     local h = metatable(op).__len
     if h then
       return (h(op))       --使用操作数调用处理器
     elseif type(op) == "table" then
       return #op              --原始表长度
     else  --没有可用的处理器:错误
       error(···)
     end
   end
 end
2014-09-08 03:05:27