2014-06-21 12 views
5

Ho una funzione che voglio aggiungere dinamicamente mentre il programma gira.accoda alla funzione lua

Diciamo che ho funzione Foo:

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

e voglio cambiare Foo() a:

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

più avanti nel programma. C'è un modo per fare questo?

risposta

7

Fallo e basta. Il codice che hai scritto funziona bene. Le funzioni in Lua possono essere ridefinite come desiderato.

Se non sai cosa foo fa, si può fare questo:

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

o forse è più chiaro di utilizzare una tabella di funzioni:

local F={ Function1, Function2, Function3 } 

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

degli Ultimi, fare

F[#F+1]=Function4 

e non è necessario ridefinire il numero foo.

+0

è il 'do' necessario? – Blauhirn

+0

@Blauhirn, non rigorosamente, ma mantiene la definizione di 'old' local a quel blocco. – lhf

0

Questa è una risposta supplementare con informazioni di base.

Gli identificatori Lua sono utilizzati per variabili globali, variabili locali, parametri e campi di tabella. Hanno qualsiasi tipo di valore.

Le funzioni Lua sono valori. Le funzioni Lua sono tutte anonime, indipendentemente dalla sintassi utilizzata per definirle.

function f() 
--... 
end 

è un'istruzione Lua che compila una definizione di funzione e un'assegnazione a una variabile. E 'un'alternativa per

f = function() 
--... 
end 

Ogni volta che viene eseguita una definizione di funzione, produce un nuovo valore della funzione, che viene poi utilizzato in qualsiasi espressione o assegnazione associato.

Dovrebbe essere chiaro che nessuna delle due istruzioni crea necessariamente una nuova variabile, né richiede di avere sempre lo stesso valore, né richiede di mantenere sempre un valore di funzione. Inoltre, il valore della funzione creato non deve essere sempre trattenuto solo da una variabile. Può essere copiato come qualsiasi altro valore.

Inoltre, proprio come gli altri valori, i valori delle funzioni vengono eliminati. Quindi, se f ha un valore di funzione e gli viene assegnato un valore diverso o esce dall'ambito (ad esempio, se non si trattava di una variabile globale), il valore precedente verrà raccolto automaticamente quando nient'altro si riferisce ad esso.


Senza alcun altro contesto per function f() end, si potrebbe supporre che f è una variabile globale. Ma non è necessariamente il caso. Se f era un locale locale o un parametro, è lo f a cui verrebbe assegnato.