能否重载字符串的运算符?

在 Lua 中,能否向字符串添加自己的运算符和元方法呢?

我想做这样的事情:

local str = "test"

print(str[2]) --> "e"
print(str()) --> "TEST"
print(-str) --> "tset"
print(str + "er") --> "tester"
print(str * 2) --> "testtest"
点赞
用户7140551
用户7140551

可以使用 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('',...),因为它只能用于表。但是通过上面的“技巧”,可以轻松地将不同的方法插入字符串中。

请记住,只有在确实需要时,才在自己的代码中局部使用此方法,因为在项目中全局使用会引起冲突。

然而,正确操作字符串或数据的方法是使用模块中的方法。本示例中提供的元方法不适用于 OOP,并且在定义后影响 Lua 作用域中的所有字符串。Lua 给我们编辑字符串的元表的权力,但我们应该负责地使用它。

在更改整个程序中字符串的元功能之前,请先使用如 str:sub()str:upper() 和其他方法的示例。

2016-12-21 11:36:33