Lua覆盖字符串#

时间:2014-04-15 13:29:46

标签: lua operator-overloading metatable meta-method

我试图在Lua中使用我自己的长度方法来处理字符串。 我已成功覆盖了字符串的len()方法,但我不知道如何为#manrator。

执行此操作
orig_len = string.len
function my_len(s)
  print(s)
  return orig_len(s)
end

string.len = my_len
abc = 'abc'

如果我打电话:

print(abc:len())

输出:

abc
3

但是

print(#abc)

仅输出' 3'这意味着它称为原始长度函数而不是我的。有没有办法让#call my length function?

2 个答案:

答案 0 :(得分:7)

你无法覆盖Lua中字符串的#运算符,甚至不能覆盖metatable:__len元方法不适用于字符串。

事实上,实际上没有覆盖 Lua中任何运算符的概念。 Lua metamethods是后备:当Lua无法继续自己时,会使用它们。因此,算术元方法不适用于数字,长度元方法不适用于字符串。

表的情况不同,因为它们用于在Lua中实现对象。

答案 1 :(得分:4)

  

我正试图在Lua中使用我自己的长度方法来处理字符串。

你不能从Lua那里做到这一点。

您需要修改Lua源,特别是虚拟机(lvm.c)并更改其对操作码OP_LEN的处理。在Lua 5.2中,您需要更改luaV_objlen以检查元方法,然后才能获得字符串的实际长度:

case LUA_TSTRING: {
  tm = luaT_gettmbyobj(L, rb, TM_LEN);        // <--- add this line
  if (!ttisnil(tm))                           // <--- add this line
      break;                                  // <--- add this line
  setnvalue(ra, cast_num(tsvalue(rb)->len));
  return;
}

但这似乎是运算符重载滥用,比如将+重载为分词或其他内容。