Lua:通过本地变量改进多个单词替换功能。
2014-4-23 2:36:46
收藏:0
阅读:80
评论:1
我有三个本地数字(总数、经过时间和百分比)和一个字符串。用户可以使用文本字段自定义顺序以及显示给他的数字。用户可以键入{data1}以显示总数,{data2}以显示经过时间,{data3}以显示百分比。
例如,一个人输入文本:"我用了{data2},是{data3}%的{data1}分钟。"函数返回:"我用了1000,是5000分钟的20%。"
我创建了下面的函数来处理替换,但我几乎可以肯定,存在更好的方法来实现此结果。 那么我的问题是如何改进这个大函数?
--用户输入
local user_chose = "我用了{data2},是{data3}%的{data1}分钟。"
--替换的本地值
local total = 5000
local elapsedtime = 1000
local percent = 20
--替换函数
local _data1, _data2, _data3
local replace_func = function(data)
if (data == "data1") then
return _data1
elseif (data == "data2") then
return _data2
elseif (data == "data3") then
return _data3
end
end
function create_text(data1, data2, data3)
--更新替换函数使用的三个本地值
_data1, _data2, _data3 = data1, data2, data3
--进行gsub匹配
return string.gsub(user_chose, "{(.-)}", replace_func)
end
--向用户打印字符串
print(create_text(total, elapsedtime, percent))
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
用户可以输入{data1}来显示总数,{data2}来显示经过的时间,{data3}来显示百分比。
这些都是糟糕的宏名称,就像糟糕的变量名称一样。用户应该可以输入{total}来显示总数,{elapsedtime}来显示经过的时间等等。
如何改进这个大函数?
最明显的改变是传递一个表给
gsub,这样你就不需要编写替换函数。function expand(format, values) return (format:gsub("{(.-)}", values)) end local usertext = "i got the time: {elapsedtime}, {percent}% of {total} minutes" local expanded = expand(usertext, {total = 50000, elapsedtime = 1000, percent = 20})如果你不反对扩展
string(有些人认为这是可耻的),你可以获得更好的用法语法:function string:expand(values) return (self:gsub("{(.-)}", values)) end local expanded = usertext:expand { total = 50000, elapsedtime = 1000, percent = 20 }如果你坚持使用位置宏名称,你可以这样做:
function string:expand(...) local args = {...} local function getarg(i) return args[tonumber(i)] end return (self:gsub('{data(%d+)}', getarg)) end local usertext = "i got the time: {data2}, {data3}% of {data1} minutes" local expanded = usertext:expand(50000, 1000, 20)