2011-05-20 9 views

Odpowiedz

29

Lua jest dynamicznym językiem, a funkcje są jedynie wartością, którą można wywołać za pomocą operatora (). Więc tak naprawdę nie musisz przesyłać dalej deklaracji funkcji, ale upewnij się, że zmienna w zasięgu, gdy ją wywołasz, jest zmienną, która Twoim zdaniem jest.

Nie jest to w ogóle problem dla zmiennych globalnych zawierających funkcje, ponieważ globalne środowisko jest domyślnym miejscem, w którym należy szukać nazwy zmiennej. W przypadku funkcji lokalnych należy się jednak upewnić, że zmienna lokalna jest już w zasięgu w punkcie leksykalnym, w którym należy wywoływać zapisaną wartość, a także upewnić się, że w czasie wykonywania rzeczywiście zawiera ona wartość, którą można nazwać .

Na przykład tutaj jest parę wzajemnie rekurencyjnych funkcji lokalnych:

local a,b 
a = function() return b() end 
b = function() return a() end 

Oczywiście, to również przykład użycia ogon połączeń, aby umożliwić nieskończonej rekurencji, że nic nie robi, ale chodzi tu jest deklaracje. Deklarując zmienne za pomocą local, zanim zostanie w nich przechowywana funkcja, te nazwy są znane jako zmienne lokalne w zakresie leksykalnym reszty przykładu. Następnie dwie funkcje są przechowywane, każda odnosi się do drugiej zmiennej.

+1

OK, dziękuję. Udało mi się to ustalić na własną rękę, ale ta odpowiedź była jednak przydatna. –

9

można przekazać zadeklarować funkcję deklarując swoją nazwę przed oświadczając rzeczywiste ciało funkcji:

local func1 
local func2 = function() 
    func1() 
end 
func1 = function() 
    --do something 
end 

jednak naprzód deklaracje są konieczne tylko podczas deklarowania funkcji z zakresu lokalnego. Czyli generalnie to, co chcesz zrobić, ale Lua obsługuje również składnię bardziej jak C, w którym to przypadku naprzód deklaracja nie jest konieczne:

function func2() 
    func1() 
end 
function func1() 
    --do something 
end 
+4

W rzeczywistości twój pierwszy przykład nie robi tego, co myślisz, ponieważ drugi "lokalny func1" deklaruje zmienną * new * o tej nazwie i pozostawia pierwsze 'func1' osierocone i wciąż ustawione na' nil'. – RBerteig

+0

Ups, dobra sprawa, naprawię to, – jhocking

+1

Twój drugi przykład też jest zły, ponieważ zadziała naiwnie wywołanie "func2" z func1 poniżej, ale nie z powodu jakiegokolwiek "zgłoszenia do przodu". Zamiast tego func1 jest deklarowany w środowisku globalnym (_G), a gdy func2 wyszukuje func1, sprawdza _G. Oznacza to, że func1 jest zadeklarowany przed uruchomieniem func2, a więc gdy sprawdza _G, to działa. Rzucanie wywołania func2 zaraz po zdefiniowaniu func2 powoduje błąd ... ponieważ func1 nie jest zadeklarowany/zdefiniowany. – LuaWeaver

0

Testowanie pod wbudowanego Lua w FreeSWITCH, deklaracja przodu nie działa:

fmsg("CRIT", "It worked.") 
function fmsg(infotype, msg) 
    freeswitch.consoleLog(infotype, msg .. "\n") 
end 

wynik:

[ERR] mod_lua.cpp: 203 /usr/local/freeswitch/scripts/foo.lua:1: próba wywołać globalną 'fmsg' (wartość zerowa)

Odwracanie zamówienia działa (duh).

0

Nie działa dla mnie, jeśli spróbuję wywołać funkcję przed definicją. Używam tego skryptu Lua w Nginx Conf.

lua entry thread aborted: runtime error: lua_redirect.lua:109: attempt to call global 'throwErrorIfAny' (a nil value)

Fragment kodu -

... 
throwErrorIfAny() 
... 

function throwErrorIfAny() 
    ngx.say("request not allowed") 
    ngx.exit(ngx.HTTP_OK) 
end 

Biorąc pod uwagę kilka innych odpowiedzi również podkreślić, że to nie działa dla nich albo, możliwe jest, że do przodu deklaracja Lua nie współpracuje z innymi narzędziami .

PS: Działa dobrze, jeśli wcześniej umieściłem definicję funkcji, a następnie zadzwonię do niej po oddziale.

Powiązane problemy