Lua:用本地值改进多字替换

时间:2014-04-22 18:57:14

标签: string replace lua gsub

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

1 个答案:

答案 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)