Lua - Базовая таблица функций

Я пытаюсь понять, как правильно работает таблица функций Lua.

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

Это мой код:

function qwe()
   print ("qwe fired")
end

function asd() 
   print ("asd fired")
end

local tab = {
   qwe(),
   asd(),
}

function zxc()
   print ("zxc start")    
   for k,v in pairs (tab) do
      return v
   end
   print ("zxc end")
end

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

2 ответа

Решение
local tab = {
   qwe(),
   asd(),
}

Вы назначаете результаты функций в таблицу вместо ссылок на функции. Вы должны делать:

local tab = {
   qwe,
   asd,
}

Если вам необходимо вызвать эти значения, вы просто используете их как функцию:

tab[1]() -- call `qwe` and discard results
-- or
tab[2]() -- call `asd` and discard results
-- or
for k,v in pairs (tab) do
  return v() -- call first function and return its result(s)
end

Вот мои 2 решения, основанные на ответе Пола.

- загружать функции напрямую

function foo()
    print("foo fired")
end

function goo()
    print("goo fired")
end

function poo()
    print("poo fired")
end

local roo = {
    "foo()",
    "goo()",
    "poo()",
}

function zoo ()
    print("\n ***** load function directly *****")
    for k,v in pairs (roo) do
        print(k,v)
        load(v)()
    end
print(" *** end ***\n\n")
end

- загрузить каскадную строку

function foo()
    print("foo fired")
end

function goo()
    print("goo fired")
end

function poo()
    print("poo fired")
end

local roo = {
    "foo",
    "goo",
    "poo",
}

function zoo ()
    print("\n ***** load concatenated string *****")
    for k,v in pairs (roo) do
        print(k,v)
        load(v.."()")()
    end
    print(" *** end ***\n\n")
end
Другие вопросы по тегам