2013-06-07 3 views
11

Немного путают все это; так вот что я пытаюсь сделать! Есть размораживание таким образом:Как передать функцию в качестве параметра в Lua?

block_basic_DEF = 
{ 
    image = "button.png", 
    name = "basic block", 
    obj_table = this_obj_table.common_objects_table, 
    startup = function() init(), <----- This is the problem 
} 

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

function spawn(params) 
    local obj = display.newImage(params.image) 
    -- etc. 

В этом block_basic_DEF я хотел бы передать адрес функции init() таким образом, что в моей икре я может сделать что-то вроде:

params.startup() --ie на самом деле вызывать исходную функцию init

Я из фона C, где это было всего лишь указателями на указатели, но это плохой язык в мире ООП, по-видимому !!! функции :-))

Приветствия

+2

"* Иметь размораживание таким образом *" Это не "DEF". У Lua нет «определений». Это * таблица *, которая является * значением *. Также как функции. –

+0

'params.startup()' фактически обрабатывает значение, на которое ссылается 'params' как таблица, и индексирует его с помощью строки' startup', чтобы получить ее значение (оператор точки). Затем он вызывает значение как функцию (оператор скобок). Эта функция затем вызывает значение, на которое ссылается 'init' как функция. –

ответ

17

Lua просто значения, и вы можете использовать их asssign свое имя без скобок:

function init() 
    print("init"); 
end 

block = { 
    startup = init 
} 

А потом называть его как обычный функция

block.startup() 

Это близко к ООП, но на самом деле это так же просто, как факт, что функция является нормальным значением.

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

startup = function() print("init") end 
+0

Спасибо !. Проблема заключалась в том, что моя функция init() была определена после моей ссылки на нее. Я предпочитаю определения и данные в верхней части моего файла, а не через него (всегда выглядит грязно тоже). Как я могу перенаправить ссылку? Cheers –

+0

Лямбда-функции, используемые правильно, не беспорядочны. Пришло время, когда вы уронили древние идиомы C и двинулись дальше :) –

+0

@MarkHula: для прямой ссылки вам нужно объявить переменные, которые вы собираетесь использовать в верхней части файла. Если его локальные переменные вы можете объявить их с помощью 'local var1, var2, var3'. Если объявление слишком большого количества имен является уродливым, вы можете объявить одну таблицу «namespace» 'local M = {}', а затем использовать поля в качестве переменных: 'M.var1 = ...'. Наконец, глобальные переменные также работают так, за исключением того, что таблица пространств имен неявно. – hugomg

5

Вы просто забыли end ключевое слово. Это часть определения функции, и вы не можете ее оставить. Вы не отказались от закрытия } в C или вправо?

block_basic_DEF = 
{ 
    image = "button.png", 
    name = "basic block", 
    obj_table = this_obj_table.common_objects_table, 
    startup = function() init() end, -- <-- This was the problem 
} 

Помимо формы, что следующие два варианта синтаксиса равны:

function foo() 
end 

foo = function() 
end 
+1

Однако синтаксис не равен 100%, если вы объявляете «локальную функцию». Чтобы иметь возможность вызывать функцию рекурсивно, вам нужно объявить переменную перед назначением: 'local foo; foo = function() end' – hugomg

+0

Именно поэтому в образце кода нет 'local';) – dualed

Смежные вопросы