Lua,修改打印功能

时间:2017-09-28 03:04:18

标签: lua

我在lua中编写一个通用的Log()函数,它使用lua print函数:

Log (variable, 'String: %s ', str, 'Word: %d', w)

目前我正在使用以下方法:

print(string.format (variable, 'String: %s ', str, 'Word: %d', w))

我尝试过类似的事情:

Log = function(...) begin
return print(string.format(...))
end

但它不起作用,这是正确的方法吗?或者有没有更好的通用方法来完成这项工作?

2 个答案:

答案 0 :(得分:2)

我不认为您当前的方法有效,因为string.format的第一个参数需要格式说明符,而不是其他参数。

无论如何,这是将格式和打印结合在一起的方法:

Log = function(...)
  return print(string.format(...))
end

并称之为:

Log("String: %s  Number: %d", 'hello' , 42)

此外,最好使格式说明符参数更明确,并使用io.write代替print来更好地控制打印:

function Log(fmt, ...)
  return io.write(string.format(fmt, ...))
end

答案 1 :(得分:2)

如果您只想打印一系列值,可以使用print

执行此操作
print(variable, 'String: %s ', str, 'Word: %d', w)

你似乎想要的是更复杂的东西。您的算法似乎是:

  1. 对于每个论点:
    1. 如果参数不是字符串,则将其转换为字符串并打印出来。
    2. 如果参数是一个字符串,请确定它有多少%个模式(让我们称这个数字为 k )。传递string.format当前参数字符串和以下 k 参数,打印生成的字符串。提前 k 参数。
  2. 这是一个比单线系统更复杂的算法。

    使用Lua 5.3,这就是这样一个函数的样子(注意:几乎没有经过测试的代码):

    function Log(...)
        local values = {}
    
        local params = table.pack(...)
    
        local curr_ix = 1
        while (curr_ix <= params.n) do
            local value = params[curr_ix]
            if(type(value) == "string") then
                --Count the number of `%` characters, *except* for
                --sequential `%%`.
                local num_formats = 0
                for _ in value:gmatch("%%[^%%]") do
                    num_formats = num_formats + 1
                end
    
                value = string.format(table.unpack(params, curr_ix, num_formats + curr_ix))
    
                curr_ix = curr_ix + num_formats
            end
    
            values[#values + 1] = value
            curr_ix = curr_ix + 1
        end
    
        print(table.unpack(values))
    end