1

I have a table that has multiple functions in it. I'm trying to write a single function that will go through and use all the functions by passing random information into it.

Methods = {}

insert functions into Methods Table

function Methods:Multi() if #self > 0 then .........................

I'm guessing i need a loop that goes through the entire table but I can't do #self because i need it to do each function multiple times. Not sure how to pass in random info to the function either. Any help would be appreciated

0

4 Answers 4

2

Your problem doesn't seem to be all that specific - you're likely going to need to define exactly what you want to happen in more detail in order to be able to implement a program for it. (Sort of like if you told me "I need a program that calculates a number" - I'd probably respond "okay, what number do you want it to calculate?"

Things to consider:

  1. Exactly how many times do you want to call each function? Will this be the same for each function? Will it vary?
  2. If the number of calls varies, what should determine this?
  3. How exactly do you want to determine what parameters are passed? Their types/count? Their values?

A very basic starting framework might look like this:

Methods = {}

-- Insert functions into Methods table

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

which would call each function 5 times, albeit w/o arguments.

Sign up to request clarification or add additional context in comments.

Comments

0

I modified the above suggestion to

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

Example usage:

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

CallFuncs( 2, t, 'foo' )

yields

foo
3
foo
3

2 Comments

fairly sure your code breaks with mutiple arguments passed into the ... portion.
No, I think it's the standard way of handling variable length parameter lists.
0

Try this:

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

Usage:

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

CallFuncs(3, t, 2)

This assumes all the functions in the table have more or less the same arguments.

Info: The ... you see is lua's syntax for variable arguments (these are packed into a table and used as the last argument to the function), and the unpack function takes a table and multi-returns a series of values.

4 Comments

gives me error "'do' expected near for" Also, what are you assuming the table is in this function? I'm guessing times is how many times i want the called? what is "..."?
See explanation, also tweaked my for loop to fix it.
Modified it slightly to fix the missing do, as well as changed the outer loop from a while to a for since for basic numerical iteration, the for syntax is far more concise.
I am useing a table like: t={function(n) print(n+1) end, function(n) print(n+2)} When i use the function above I put: CallFuncs(3, t, 'foo') Gives me the error: Bad argument #1 to 'unpack' (table expected, got string)
0

If you are asking for something to call a list of functions, I just typed this very small module for you (if you can even call it that).

-- 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).

If I wasted my time with that, it was fun anyway, but after typing it I reread your question... You want something to iterate through a list of functions and pass a random number to each one.

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.