3

在学习 Lua 的过程中,我从这里借用了一些代码 来使用字符串索引,就是这样:

getmetatable("").__index = function(str, i) return string.sub(str, i, i) end

之后,我写了一个函数来反转一个字符串作为练习。

function reverse_string(str)
    local s = ""
    for i = string.len(str), 1, -1 do s = s .. str[i] end
    return s
end

这工作正常,直到我将 更改string.len(str)str:len(),然后我收到此错误:

reverse.lua:9: bad argument #2 to 'sub' (number expected, got string)

调试 print() 告诉我该__index函数正在被调用str:len(),并且i参数正在变成字符串“len”。我知道 str:len() 可以在没有元表的情况下工作,但是一旦我添加它就会发生这种情况,为什么?

4

2 回答 2

3

来自Lua 5.2 参考手册:字符串操作

字符串库在表字符串中提供了所有函数。它还为 __index 字段指向字符串表的字符串设置元表。因此,您可以使用面向对象风格的字符串函数。例如,string.byte(s,i) 可以写成 s:byte(i)。

因此,像这样的面向对象风格str:len()来自__index您已修改的默认元方法。

于 2013-08-11T04:07:43.110 回答
2

索引函数被传递给表,以及被索引的键。所以'str'应该是字符串,'i'应该是你的情况的关键。因为“len”不在元表中,所以它调用 __index 并将字符串作为第一个参数传递,将键(“len”)作为第二个参数传递。看起来您需要检查“i”的类型以了解如何更好地处理字符串

getmetatable("").__index = function(str, key)
  if type(key) == "string" then
    return string[key]
  else
    return string.sub(str, key, key)
  end
end

str = "hello, world!"
print(str:len())
print(str[5])

看到这里了解更多信息

于 2013-08-11T04:08:56.203 回答