2014-06-21 21 views
5

Mam funkcję, którą chcę dynamicznie dodać podczas działania programu.dodaj do funkcji lua

Powiedzmy mam function Foo:

function foo() 
    Function1() 
    Function2() 
    Function3() 
end 

i chcę zmienić Foo() na adres:

function foo() 
    Function1() 
    Function2() 
    Function3() 
    Function4() 
end 

później w programie. Czy jest jakiś sposób to zrobić?

Odpowiedz

7

Po prostu zrób to. Kod, który napisałeś, działa dobrze. Funkcje w Lua można dowolnie przedefiniować.

Jeśli nie wiesz, co foo robi, można to zrobić:

do 
    local old = foo 
    foo = function() old() Function4() end 
end 

A może to jest bardziej czytelna w obsłudze tabelę funkcji:

local F={ Function1, Function2, Function3 } 

function foo() 
    for i=1,#F do F[i]() end 
end 

ostatni, zrobić

F[#F+1]=Function4 

i nie trzeba ponownie definiować foo.

+0

jest "potrzebne"? – Blauhirn

+0

@Blauhirn, nie ściśle, ale zachowuje definicję "starego" lokalnego dla tego bloku. – lhf

0

Jest to odpowiedź uzupełniające informacje tła.

identyfikatory Lua są wykorzystywane do zmiennych globalnych, zmiennych lokalnych, parametrów i pól tabeli. Posiadają jakąkolwiek wartość.

funkcji Lua są wartościami. Funkcje Lua są anonimowe, niezależnie od składni użytej do ich zdefiniowania.

function f() 
--... 
end 

to instrukcja Lua kompilująca się do definicji funkcji i przypisania do zmiennej. Jest to alternatywna do

f = function() 
--... 
end 

każdym razem, definicja funkcji jest wykonywany, wytwarza nową wartość funkcji, która jest następnie wykorzystywana w jakiejkolwiek związanej wypowiedzi lub zadania.

Powinno być jasne, że ani sprawozdanie koniecznie tworzy nową zmienną ani wymaga, aby zawsze mieć taką samą wartość, ani nie wymaga, aby zawsze posiadać wartość funkcji. Ponadto utworzona funkcja nie musi zawsze być trzymana tylko przez jedną zmienną. Można go kopiować tak jak każdą inną wartość.

Ponadto, podobnie jak inne wartości, wartości funkcji są zbierane śmieci. Tak więc, jeśli f ma wartość funkcji i jest przypisana do innej wartości lub wykracza poza zakres (powiedzmy, jeśli nie była zmienną globalną), poprzednia wartość będzie zbiorem śmieci, gdy nic innego się do niego nie odniesie.


Bez jakiegokolwiek innego kontekstu function f() end, to zakładamy, że f jest zmienną globalną. Ale niekoniecznie tak jest. Jeśli f był lokalny lub parametr zakres, to jest f, który zostanie przypisany.