【问题标题】:Is it possible to overload operators for strings?是否可以重载字符串的运算符?
【发布时间】:2017-05-06 19:49:14
【问题描述】:

是否可以在 Lua 中为字符串添加自己的运算符和元方法?

我希望做这样的事情:

local str = "test"

print(str[2]) --> "e"
print(str()) --> "TEST"
print(-str) --> "tset"
print(str + "er") --> "tester"
print(str * 2) --> "testtest"

【问题讨论】:

    标签: string lua operator-overloading operators


    【解决方案1】:

    是的,在 Lua 中使用字符串的“秘密”元表,可以为字符串定义许多不同的运算符重载。

    试试下面的代码:

    getmetatable('').__index = function(str,i) return string.sub(str,i,i) end
    getmetatable('').__call = function(str,i) return string.upper(str) end
    getmetatable('').__unm = function(str,i) return string.reverse(str) end
    getmetatable('').__add = function(str,i) return (str .. i) end
    getmetatable('').__mul = function(str,i) return string.rep(str, i) end
    
    local str = "test"
    
    print(str[2]) --> "e"
    print(str()) --> "TEST"
    print(-str) --> "tset"
    print(str + "er") --> "tester"
    print(str * 2) --> "testtest"
    

    您不能使用setmetatable('',...) 的原因是它只能用于表格。但是通过上面的“hack”,您可以轻松地将不同的方法插入到字符串中。

    如果您确实需要,请记住仅在您自己的代码中本地使用它,因为在项目中全局使用它可能会发生冲突。

    然而,操作字符串或数据的正确方法是使用模块中的方法。此示例中提供的元方法不是 OOP 友好的,并且在定义后会影响 Lua 范围内的所有字符串。 Lua 赋予我们编辑字符串元表的能力,但我们应该负责任地使用它。

    没有什么是str:sub()str:upper()和其他方法做不到的,像这样的例子应该在整个程序中更改字符串的元功能之前使用。

    【讨论】:

    • 另请注意,替换 __index 将使所有默认方法为零。
    • 您可以使用 debug.setmetatable 设置元表!
    • 保留标准函数:getmetatable('').__index = function(str,i) return type(i) == 'number' and string.sub(str,i,i) or string[i] end
    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 2015-01-01
    • 2012-09-04
    • 2010-10-20
    • 2010-10-21
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多