我有3个本地数字(总数、经过时间和百分比)和一个字符串。这个字符串用户可以使用一个文本字段来自定义顺序以及显示给他的数字。用户可以键入{data1}显示总计,{data2}显示经过的时间,{data 3}显示百分比。
例如,一个人输入文本:"我得到了时间:{data2},{data3}%的{data1}分钟"。函数返回:"我得到了时间:1000,5000分钟的20%"
我已经创建了下面的函数来处理替换,但我几乎可以肯定存在一种更好的方法来实现这个结果。所以我的问题是如何改进这个大功能
--user typed
local user_chose = "i got the time: {data2}, {data3}% of {data1} minutes"
--local values for replacement
local total = 5000
local elapsedtime = 1000
local percent = 20
--replace function
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)
--update the 3 locals used on replace_func
_data1, _data2, _data3 = data1, data2, data3
--do the gsub
return string.gsub ( user_chose, "{(.-)}", replace_func)
end
--print the string to the user
print (create_text (total, elapsedtime, percent))
用户可以键入{data1}显示总计,{data2}显示经过的时间,{data 3}显示百分比
这些都是糟糕的宏名称,就像它们是糟糕的变量名称一样。用户应该能够键入{total}显示total,{elapsedtime}显示elapsedttime等。
我该如何改进这个大功能?
最明显的变化是将一个表传递给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)