2013-06-07 6 views
11

Trochę zdezorientowany tym wszystkim; więc oto, co próbuję zrobić! Mają def tak:Jak przekazać funkcję jako parametr w 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 
} 

w innym pliku mam dostępu, jak można by się spodziewać z:

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

W tym block_basic_DEF pragnę przekazać adres funkcji init() taka, że ​​w moim tarło I może zrobić coś takiego:

params.startup() --ie tak naprawdę wywołuję oryginalną funkcję init

Pochodzę z tła C, w którym to były tylko wskaźniki do wskaźników, ale to jest zły język w świecie OOP pozornie !!! Funkcje :-))

Cheers

+2

"* Mają więc def *" To nie jest "def". Lua nie ma "definicji". To jest * tabela *, która jest * wartością *. Podobnie jak funkcje. –

+0

'params.startup()' faktycznie traktuje wartość przywoływaną przez 'params' jako tabelę i indeksuje ją za pomocą ciągu' startup', aby uzyskać jego wartość (operator kropki). Następnie wywołuje wartość jako funkcję (operator nawiasów). Funkcja ta wywołuje następnie wartość, do której odwołuje się funkcja "init". –

Odpowiedz

17

Lua są tylko wartości, a można asssign je używając ich nazwy bez parens:

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

block = { 
    startup = init 
} 

a następnie wywołać go jak zwykły funkcji

block.startup() 

Jest blisko do OOP, ale w rzeczywistości jest tak proste, jak fakt, że funkcja jest normalną wartością.

Jeśli chcesz coś bardziej podobnego do lambda, trzeba przeliterować cały funkcji, pomijając nazwę:

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

Dzięki !. Problem polegał na tym, że moja funkcja init() została zdefiniowana po moim odwołaniu się do niej. Wolę definicje i dane u góry mojego pliku, nie przez to (zawsze wygląda na niechlujnie). Jak mogę przesłać coś do przodu? Pozdrowienia –

+0

Funkcje Lambda używane poprawnie nie są niechlujne. Czas, żebyś rzucił ci starożytne idiomy C i ruszył dalej :) –

+0

@MarkHula: W celu odniesienia do przodu musisz zadeklarować zmienne, których będziesz używał u góry pliku. Jeśli jego zmienne lokalne można zadeklarować za pomocą linii 'local var1, var2, var3'. Jeśli deklarowanie zbyt wielu nazw jest brzydkie, możesz zadeklarować pojedynczą tablicę "przestrzeni nazw" lokalny M = {} ', a następnie użyć pól jako zmiennych:' M.var1 = ... '. Na koniec zmienne globalne działają również tak, z tym wyjątkiem, że tabela przestrzeni nazw jest niejawna. – hugomg

5

Po prostu zapomniał słowa kluczowego end. Jest częścią definicji funkcji i nie można tego pominąć. Nie pominiesz zamknięcia } w C albo w prawo?

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 
} 

Oprócz postaci, że dwa następujące zmiany składniowe są równe:

function foo() 
end 

foo = function() 
end 
+1

Jednak składnia nie jest równa 100%, jeśli deklarujesz 'funkcję lokalną'. Aby móc wywoływać funkcję rekursywnie, musisz zadeklarować zmienną przed przypisaniem: 'local foo; foo = function() end' – hugomg

+0

Właśnie dlatego w próbce kodu nie ma 'local';) – dualed