仅函数过程中的Lua过程vararg第一个参数

问题描述 投票:1回答:2

我正在尝试获取一些棘手的日志记录,但无法理解为什么...仅在调用的函数中处理第一个参数

我有这个功能

local logger = function (name, ...)
    -- Expected table processing here, but no.
    print("[" .. name .. "] log called with " .. ...)
end

return setmetatable({}, {__index = function(self, name)
    local log = function(...)
        return logger(name, ...)
    end
    self[name] = log
    return log
end})

以及它的名字

local testf = require "test_log"["TestA"]

testf("TestB", "TestC")
testf("TestC", "TestB")

但返回此结果

[TestA] log called with TestB
[TestA] log called with TestC

我无法从testf函数获得第二个(及以后的)参数,并且也无法得到原因。

提前感谢!

lua functional-programming variadic-functions
2个回答
0
投票

您的代码仅使用第一个参数

local s = ''
for i=1,select('#',...) do s = s .. select(i, ...) end
print("[" .. name .. "] log called with " .. s)

也可以使用s = table.concat({...}),但是如果vararg包含nil值,它将产生不同的结果


0
投票

您无法连接...,因为它不是值。相反,Lua只是获取列表的第一个值。

如果要连接多个值,请先使用table.concat

local concatenated = table.concat({...})

如果您今天感觉特别聪明,也可以做这样的事情:

local logger = function (...)
   print(string.format("[%s] log called with"..string.rep(" %s", select("#")), ...))
end
© www.soinside.com 2019 - 2024. All rights reserved.