我正在尝试创建一个调试打印函数,它将文件句柄作为第一个参数.首先,我写一个这样的函数:
function fprint (f, ...)
for i, v in ipairs{...} do
f:write(tostring(v))
f:write("\t")
end
f:write("\n")
end
Run Code Online (Sandbox Code Playgroud)
只要我不在nil参数中传递值,此函数就可以工作.但是,如果我用a调用nil它,它不会打印nil值和其余参数.
fprint(io.stderr, 1, 2, nil, 3)
=> prints only 1 and 2
Run Code Online (Sandbox Code Playgroud)
那么,解决这个问题的正确方法是什么?
Mic*_*man 29
实际上,nil在varargs中处理值很容易,你只需要使用select函数,它甚至可以工作nil(它计算实际的参数数量).以下习惯用法非常有用,它是table.packLua 5.2中的核心库函数:
function table.pack(...)
return { n = select("#", ...), ... }
end
Run Code Online (Sandbox Code Playgroud)
参数的数量存储在字段中n,因此为了迭代它们,只需使用:
function vararg(...)
local args = table.pack(...)
for i=1,args.n do
-- do something with args[i], careful, it might be nil!
end
end
Run Code Online (Sandbox Code Playgroud)