Jak wywołać funkcję, która musi być wywołana powyżej jej utworzenia? Czytałem coś o deklaracjach forward, ale Google nie jest w tym przypadku pomocny. Jaka jest prawidłowa składnia tego?Forward zdefiniować funkcję w Lua?
Dzięki.
Jak wywołać funkcję, która musi być wywołana powyżej jej utworzenia? Czytałem coś o deklaracjach forward, ale Google nie jest w tym przypadku pomocny. Jaka jest prawidłowa składnia tego?Forward zdefiniować funkcję w Lua?
Dzięki.
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.
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
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
Ups, dobra sprawa, naprawię to, – jhocking
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
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).
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.
OK, dziękuję. Udało mi się to ustalić na własną rękę, ale ta odpowiedź była jednak przydatna. –