我有3个本地人数(总数,经过时间和百分比)和一个字符串。该字符串用户可以使用文本字段来自定义顺序以及向他显示哪些数字。 用户可以键入{data1}以显示总数,{data2}显示已用时间,{data3}显示百分比。
例如,一个人输入文字:“我得到的时间:{data2},{data3}%{data1}分钟”。 该函数返回:“我得到的时间:1000,20分钟的5000分钟”
我已经创建了下面的函数来处理替换,但我几乎可以肯定存在一种更好的方法来实现这个结果。 所以我的问题是如何改善这个重要功能?
--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))
答案 0 :(得分:4)
用户可以输入{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)