【问题标题】:Lua, Modify print functionLua,修改打印功能
【发布时间】:2017-09-28 03:04:18
【问题描述】:

我正在使用 lua 打印函数在 lua 中编写一个通用的 Log() 函数:

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

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

【问题讨论】:

    标签: lua


    【解决方案1】:

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

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

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

    1. 对于每个参数:
      1. 如果参数不是字符串,则将其转换为字符串并打印。
      2. 如果参数是一个字符串,计算它有多少个% 模式(让我们称这个数字为k)。传递string.format 当前参数字符串和后面的k 参数,打印结果字符串。推进 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
    

    【讨论】:

    • 这很有趣,是的,它解决了我的问题,即拥有一个通用的日志功能。我通过为每个日志类分配标志来添加另一个功能。 Log(Error,... ) Log(Info,... ) Log(Debug, ...) 通过附加参数,我可以控制详细程度。 +1 为您提供帮助
    • 此循环 for _ in value:gmatch("%%[^%%]") do 将匹配字符串 "5%% less",尽管您打算跳过连续百分比。
    【解决方案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
    

    【讨论】:

    • 指定格式不是通用解决方案,我的示例代码非常基本,但想法是拥有完全通用的 Logger
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2021-09-03
    • 2012-09-05
    • 2011-07-12
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多