Lua Обработка vararg только в функции, 1-й параметр - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь получить немного хитрое ведение журнала, но не могу понять, почему ... обрабатывает только 1-й параметр в функции с именем

У меня есть эта функция

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

Проблема в том, что я не могу получить 2-й (и более) параметры из функции testf и не могу получить почему.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Вы не можете объединить ..., потому что это не значение. Вместо этого Lua просто принимает первое значение в списке.

Если вы хотите объединить более одного значения, сначала введите table.concat:

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

Вы также можете сделать что-нибудь например, если вы чувствуете себя особенно умно сегодня:

local logger = function (...)
   print(string.format("[%s] log called with"..string.rep(" %s", select("#")), ...))
end
0 голосов
/ 20 марта 2020

В вашем коде используется только первый параметр

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

Также вы можете использовать s = table.concat({...}), но он даст другие результаты в тех случаях, когда vararg содержит нулевые значения

...