Lua:通过本地变量改进多个单词替换功能。

我有三个本地数字(总数、经过时间和百分比)和一个字符串。用户可以使用文本字段自定义顺序以及显示给他的数字。用户可以键入{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))
点赞
用户501459
用户501459

用户可以输入{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)
2014-04-22 19:20:27