在Lua中,处理包含nil的varargs的正确方法是什么?

tor*_*rus 21 lua

我正在尝试创建一个调试打印函数,它将文件句柄作为第一个参数.首先,我写一个这样的函数:

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)

  • 最有用的补充是你不能只是"解压缩"表格了.为了解压缩使用:`local tbl = {n = select("#",...),...}; print(unpack(tbl,1,tbl.n));` (2认同)