Lua中的#用于字符串覆盖。

我正在尝试在Lua中实现自己的字符串长度方法。

我已经成功地重写了字符串的len()方法,但我不知道如何做到这一点对于#运算符。

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',这意味着它调用了原始的长度函数而不是我的函数。是否有一种方法可以让#调用我的长度函数?

点赞
用户107090
用户107090

你不能重载 Lua 的字符串中的 # 运算符,即使使用元表也不行:__len 元方法不适用于字符串。

实际上,在 Lua 中没有任何覆盖任何运算符的概念。Lua 元方法是回调函数:当 Lua 不能自行处理时使用它们。因此,算术元方法不适用于数字,而长度元方法则不适用于字符串。

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

2014-04-15 14:10:45
用户501459
用户501459

我正在尝试在Lua中实现自己的字符串长度方法。

你无法从Lua中完成这个操作。

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

case LUA_TSTRING: {
  tm = luaT_gettmbyobj(L, rb, TM_LEN);        // <--- 添加这一行
  if (!ttisnil(tm))                           // <--- 添加这一行
      break;                                  // <--- 添加这一行
  setnvalue(ra, cast_num(tsvalue(rb)->len));
  return;
}

但这看起来像是操作符重载滥用,就像重载+来表示除法或其他什么。

2014-04-15 16:00:19