Lua,修改print函数

我正在用Lua编写一个通用的Log()函数,它利用Lua的print函数:

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

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

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

我尝试过类似这样的东西:

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

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

点赞
用户1009479
用户1009479

我认为你目前的方法行不通,因为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
2017-09-28 03:46:35
用户734069
用户734069

如果你只想打印一个值的序列,你可以使用 print

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

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

  1. 对于每一个参数:

    1. 如果参数不是一个字符串,那么将其转换为一个字符串并打印出来。
    2. 如果参数是一个字符串,找出它有多少个 % 模式(我们称之为 _k_)。将当前参数字符串和后面的 k 个参数传递给 string.format,并打印出结果字符串。将 k 参数向前推进。

这是一个要在一行系统中实现的非常复杂的算法。

使用 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
2017-09-28 05:11:42