Функции в таблице — Lua

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

Методы = {}

вставить функции в таблицу методов

Методы функции: Multi(), если #self > 0, то .........................

Я предполагаю, что мне нужен цикл, который проходит через всю таблицу, но я не могу сделать #self, потому что мне нужно, чтобы он выполнял каждую функцию несколько раз. Не уверен, как передать случайную информацию в функцию. Любая помощь будет оценена


lua
person Ninjai    schedule 01.11.2009    source источник


Ответы (4)


Ваша проблема не кажется такой уж конкретной - вам, вероятно, потребуется более подробно определить, что вы хотите, чтобы произошло, чтобы иметь возможность реализовать программу для этого. (Например, если бы вы сказали мне: «Мне нужна программа, которая вычисляет число», я бы, вероятно, ответил: «Хорошо, какое число вы хотите, чтобы она вычислила?»

Что следует учитывать:

  1. Сколько именно раз вы хотите вызвать каждую функцию? Будет ли это одинаково для каждой функции? Будет ли она меняться?
  2. Если количество вызовов варьируется, что должно определять это?
  3. Как именно вы хотите определить, какие параметры передаются? Их типы/количество? Их ценности?

Очень простой стартовый фреймворк может выглядеть так:

Methods = {}

-- Insert functions into Methods table

for _,func in ipairs(Methods) do
    for i=1,5 do
        func()
    end
end

который будет вызывать каждую функцию 5 раз, хотя и без аргументов.

person Amber    schedule 01.11.2009

Я изменил приведенное выше предложение на

function CallFuncs(times, funcs, ...)
    while (times > 0) do
        for _, func in pairs(funcs) do
            func(...)
        end
        times = times - 1
    end
end

Пример использования:

t = {
    function( n ) print( n ) end,
    function( n ) print( #n ) end,
}

CallFuncs( 2, t, 'foo' )

урожаи

foo
3
foo
3
person mkluwe    schedule 01.11.2009
comment
достаточно уверен, что ваш код ломается из-за нескольких аргументов, переданных в часть .... - person RCIX; 01.11.2009
comment
Нет, я думаю, что это стандартный способ обработки списков параметров переменной длины. - person mkluwe; 02.11.2009

Попробуй это:

function CallFuncs(times, funcs, ...)
    for i=1,times do
        for _, func in pairs(funcs) do
            if type(...) == "table" then func(unpack(...)) else func(...) end
        end
    end
end

Использование:

local t = {
    function(n) print(n) end,
    function(n) print(n+1) end,
    function(n) print(n+2) end
}

CallFuncs(3, t, 2)

Это предполагает, что все функции в таблице имеют более или менее одинаковые аргументы.

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

person RCIX    schedule 01.11.2009
comment
дает мне ошибку 'do', ожидаемую рядом с Кроме того, что вы предполагаете, что таблица находится в этой функции? Я предполагаю, что раз, сколько раз я хочу, чтобы звонили? что ...? - person Ninjai; 01.11.2009
comment
См. объяснение, а также подправил мой цикл for, чтобы исправить это. - person RCIX; 01.11.2009
comment
Немного изменил его, чтобы исправить отсутствующий do, а также изменил внешний цикл с while на for, поскольку для базовой числовой итерации синтаксис for гораздо более лаконичен. - person Amber; 01.11.2009
comment
Я использую такую ​​таблицу: t={function(n) print(n+1) end, function(n) print(n+2)} Когда я использую функцию выше, я помещаю: CallFuncs(3, t, 'foo ') Выдает ошибку: Неверный аргумент №1 для "распаковки" (ожидается таблица, получена строка) - person Ninjai; 01.11.2009

Если вы просите что-то, чтобы вызвать список функций, я просто набрал для вас этот очень маленький модуль (если вы вообще можете его так назвать).

-- No guarantees whether this will work.
function ExecFunc (fnctn,nTimes,Threaded,...)
    local to_call = function ()
        fnctn(...)
    end
    for x = 1,nTimes do
        if Threaded then
            coroutine.resume(coroutine.create(to_call))
        else
            to_call()
        end
    end
end
function ExecFuncs (Async,...)
    -- All parts of ... should be tables {function f, number t[, table args]}
    local funcInfo = {...}
    for _,funcThing in pairs(funcInfo) do
        local a = funcThing.args
        if a then
            ExecFunc(funcThing.f,funcThing.t,Async,unpack(a))
        else
            ExecFunc(funcThing.f,funcThing.t,Async)
        end
    end
end
-- These don't check for argument validity,
-- so you should either be careful with the arguments
-- or call these in protected mode (with pcall).

Если бы я потратил на это свое время, это все равно было бы весело, но после того, как я набрал его, я перечитал ваш вопрос... Вы хотите, чтобы что-то перебирало список функций и передавалось случайное число каждой из них.

function ExecuteWithRandomValues (func_list,async)
    assert(type(func_list) == "table","Expected table.")
    local passbacks = {}
    local threads
    if async then
        threads = {}
    end
    for _,func in pairs(func_list) do
        assert(type(func) == "function","Value [" .. _ .. "] is not a function.")
        local toCall = function ()
            local rnd = math.random(-math.huge,math.huge)
            local out = func(rnd)
            passbacks[_] = {input = rnd, output = out}
        end
        if async then
            table.insert(threads,coroutine.create(toCall))
        else
            toCall()
        end
    end
    if async then
        for _,thread in pairs(threads) do
            coroutine.resume(thread)
        end
        for _,thread in pairs(threads) do
            while coroutine.status(thread) ~= "dead" do
            end
        end
    end
    return passbacks
end
-- Again, no guarantees this thing is free of errors.
-- There are better ways to run and check the statuses
-- of asynchronous threads, but this is fairly convenient.
person rsethc    schedule 20.12.2012