sto cercando di serializzare e deserializzare una chiusura LuaLua e serializzati chiusure
la mia comprensione di base è che la fabbrica di seguito dovrebbe generare chiusure (e che Lua non molto di distinguere tra le funzioni e le chiusure - cioè ci nessun tipo 'chiusura')
> function ffactory(x) return function() return x end end
> f1 = ffactory(5)
> print(f1())
5 <-- so far so good
> s = string.dump(f1)
> f2 = load(s)
> print(f2())
table: 00000000002F7BA0 <-- expected the integer 5
> print(f2()==_ENV)
true <-- definitely didn't expect this!
I expected numero intero 5 da serializzare con f1
. Oppure, se string.dump
non è in grado di gestire le chiusure, mi aspettavo un errore.
Sono diventato abbastanza diverso (ma più quello che mi aspettavo) risultati con un lieve cambiamento. Sembra che f2
sia effettivamente una chiusura, ma string.dump non ha tentato di serializzare il valore di x nel momento in cui è stato serializzato.
Il docs non mi aiuta molto. (cosa intendono per "... con nuovi valori"?)
> function ffactory(x) return function() return x+1 end end
> f1 = ffactory(5)
> print(f1())
6 <-- good
> s = string.dump(f1)
> f2 = load(s)
> print(f2())
stdin:1: attempt to perform arithmetic on upvalue 'x' (a table value)
stack traceback:
stdin:1: in function 'f2'
stdin:1: in main chunk
[C]: in ?
Grazie. Non ero a conoscenza di debug.setupvalue. Puoi mostrarmi dove è stata spiegata la gestione di upvalue di string.dump (non qui: http://www.lua.org/manual/5.2/manual.html#pdf-string.dump). Inoltre, il rendimento di _ENV è il comportamento atteso nel mio primo esempio? – Paul
si può leggere letto su debug.getupvalue [qui] (http://www.lua.org/manual/5.2/manual.html#pdf-debug.setupvalue). non sono sicuro di quale sia l'accordo nel tuo primo esempio poiché non dovrebbe nemmeno essere compilato. stai usando load(), ma in realtà dovresti usare loadstring(). il caricamento richiede una funzione e una stringa. –
Non più. Lua 5.2 ha deprecato 'loadstring' e usa solo' load' per entrambe le stringhe e funzioni: http://www.lua.org/manual/5.2/manual.html#8.2 'loadstring' è ancora disponibile, tuttavia, e fornisce stesso risultato di 'load'. Grazie ancora! – Paul