Lua:用局部值改进多个单词的替换



我有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)

相关内容

  • 没有找到相关文章

最新更新