Próbuję serializacji i deserializacji zamknięcia LuaLua i serializowane zamknięcia
moje podstawowe zrozumienie jest, że poniżej fabryka powinna generować zamknięć (i to znacznie Lua nie rozróżnia funkcji i zamknięć - czyli tam ma typu „zamknięcie”)
> 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!
, że oczekuje się, że całkowita 5 być serializowane z f1
. Lub, jeśli string.dump
nie może obsłużyć zamknięć, oczekiwałem błędu.
Dostaję się zupełnie inaczej (ale więcej, niż się spodziewałem) w wyniku łagodnej zmiany. Wygląda na to, że f2
jest rzeczywiście zamknięciem, ale string.dump nie próbował serializować wartości x w czasie, gdy był serializowany.
The docs nie pomagają mi. (co mają na myśli "... z nowymi upustami"?)
> 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 ?
Dziękuję. Nie wiedziałem o debug.setupvalue. Czy możesz pokazać mi, gdzie w dokumentach jest wyjaśniona obsługa upvalues string.dump (nie tutaj: http://www.lua.org/manual/5.2/manual.html#pdf-string.dump). Czy zwrot z _ENV jest oczekiwanym zachowaniem w moim pierwszym przykładzie? – Paul
możesz przeczytać o debug.getupvalue [tutaj] (http://www.lua.org/manual/5.2/manual.html#pdf-debug.setupvalue). Nie jestem pewien, co to jest umowa w pierwszym przykładzie, ponieważ nie powinien nawet kompilacji. używasz load(), ale faktycznie powinno używać loadstring(). load pobiera func i string. –
Już nie. Lua 5.2 ma przestarzałe 'loadstring' i używa tylko' load' dla obu łańcuchów i funkcji: http://www.lua.org/manual/5.2/manual.html#8.2 'loadstring' jest jednak nadal dostępny i daje ten sam wynik co 'load'. Dzięki jeszcze raz! – Paul