加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

是否可以为字符串重载运算符?

发布时间:2020-12-14 21:43:19 所属栏目:大数据 来源:网络整理
导读:是否可以将自己的运算符和元方法添加到Lua中的字符串中? 我希望做这样的事情: local str = "test"print(str[2]) -- "e"print(str()) -- "TEST"print(-str) -- "tset"print(str + "er") -- "tester"print(str * 2) -- "testtest" 解决方法 是的,在Lua中使用
是否可以将自己的运算符和元方法添加到Lua中的字符串中?

我希望做这样的事情:

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) 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赋予我们编辑字符串metatable的能力,但我们应该负责使用它.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读