首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你好metatable.__len世界

你好metatable.__len世界
EN

Stack Overflow用户
提问于 2012-10-07 06:04:03
回答 1查看 4.1K关注 0票数 4

一个初学者关于Lua和元数据的问题,一个简单的例子,比如Hello,涉及len事件,不幸的是它没有返回预期的结果(我使用的是从Ubuntu的官方存储库安装的Lua5.1)。

案卷

下面是一个例子:

代码语言:javascript
复制
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;

我得到的结果是:

代码语言:javascript
复制
0
1

我原以为第一个print语句会显示1,但它会显示0,这让我大吃一惊。

我错过了什么?

根据Lua参考手册- /T1581-1993化学文摘的说法,#相当于:

代码语言:javascript
复制
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似乎是上述工作的必要条件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-07 06:08:38

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

为什么__gc和__len元方法不能在表上工作? 计划在5.2中支持表上的__len。见LuaFiveTwo。

由于您使用的是5.1,所以表上的__len无法工作。实际上,在Lua5.2上运行代码会产生

代码语言:javascript
复制
1
1

如预期的那样。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12766510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档