我在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
但它不起作用,这是正确的方法吗?或者有没有更好的通用方法来完成这项工作?
答案 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)
你似乎想要的是更复杂的东西。您的算法似乎是:
%
个模式(让我们称这个数字为 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