Lua: произвольное количество возвращаемых значений - PullRequest
3 голосов
/ 04 января 2012

Я возвращаюсь в Lua после долгого времени только на C ++ и сейчас пытаюсь снова обернуться вокруг некоторых из более сложных вещей.

представьте себе небольшую служебную функцию, которая выглядит следующим образомЧтобы вызвать функцию несколько раз для произвольного числа аргументов:

-- helper to call a function multiple times at once
function smartCall(func, ...)
    -- the variadic arguments
    local args = {...}
    -- the table to save the return values
    local ret = {}
    -- iterate over the arguments
    for i,v in ipairs(args) do
            -- if it is a table, we unpack the table
        if type(v) == "table" then
            ret[i] = func(unpack(v))
        else
            -- else we call the function directly
            ret[i] = func(v)
        end
    end
    -- return the individual return values
    return unpack(ret)
end

, тогда я могу сделать что-то вроде этого:

local a,b,c = smartCall(math.abs, -1, 2.0, -3.0)
local d,e,f = smartCall(math.min, {1.0, 0.3}, {-1.0, 2.3}, {0.5, 0.7})

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

ty

Ответы [ 2 ]

0 голосов
/ 04 января 2012

На мгновение я подумал о том, чтобы передать все как строки, затем манипулировать строкой, чтобы сделать правильный вызов функции, и вызвать ее с помощью tostring;только тогда я понял, что это вовсе не более эффективно, чем распаковка.

Затем я подумал о добавлении дополнительного аргумента, который определяет количество аргументов функции, которую вы хотите разумно вызвать.Таким образом, функции с фиксированным числом аргументов smartCall могут передавать группы своих аргументов в вызываемую функцию.Опять же, для этого нужно извлечь части таблицы или арифметику, чтобы найти номера аргументов.

Итак, я не могу придумать ни одной более простой функции.И unpack достаточно эффективен, и это не оказывает существенного влияния на общее время выполнения таких вызовов.

0 голосов
/ 04 января 2012

Если вы напишите smartCall на C, это будет проще, и вам не нужно будет создавать таблицы. Хотя я не знаю, удобно ли это вам.

...