【问题标题】:Changing metatable in Lua breaks colon operator在 Lua 中更改元表会破坏冒号运算符
【发布时间】:2013-08-11 03:43:09
【问题描述】:

在学习Lua的时候,我从here借了一些代码 使用字符串索引,就是这样:

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

【问题讨论】:

  • string.rev() 已经存在了。

标签: lua lua-table metatable


【解决方案1】:

来自Lua 5.2 Refernce Manual:String Manipulation

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

所以,像str:len() 这样的面向对象风格来自默认的元方法__index,您已对其进行了修改。

【讨论】:

  • 这似乎是一个奇怪的设计选择,但从现在开始我会记住它。
【解决方案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])

查看here了解更多信息

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多