我希望做这样的事情:
local str = "test"print(str[2]) --> "e"print(str()) --> "TEST"print(-str) --> "tset"print(str + "er") --> "tester"print(str * 2) --> "testtest"解决方法 是的,在Lua中使用字符串的“秘密”元表,可以为字符串定义许多不同的运算符重载.
请尝试以下代码:
getMetatable('').__index = function(str,i) return string.sub(str,i,i) endgetMetatable('').__call = function(str,i) return string.upper(str) endgetMetatable('').__unm = function(str,i) return string.reverse(str) endgetMetatable('').__add = function(str,i) return (str .. i) endgetMetatable('').__mul = function(str,i) return string.rep(str,i) endlocal 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赋予我们编辑字符串Metatable的能力,但我们应该负责使用它.
没有什么str:sub(),str:upper()和其他方法不能用这些在更改整个程序中字符串的元功能之前应该使用的示例.
总结以上是内存溢出为你收集整理的是否可以为字符串重载运算符?全部内容,希望文章能够帮你解决是否可以为字符串重载运算符?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)