我試圖序列化和反序列化一個Lua封閉Lua和系列化關閉
我的基本認識是,下面的工廠應該產生倒閉(這Lua中沒有太多的功能和關閉區分 - 即有是沒有類型「閉合」)
> 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!
我預期整數5與f1
被序列化。或者,如果string.dump
無法處理關閉,我預計會發生錯誤。
我得到了完全不同的結果(但我期望的結果)有輕微的變化。它看起來像f2
確實是一個閉包,但string.dump並沒有試圖在序列化時序列化x的值。
docs對我幫助不大。 (它們是什麼意思「... with new upvalues」?)
> 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 ?
謝謝。我不知道debug.setupvalue。你可以告訴我在文檔中的位置,它解釋了string.dump對upvalues的處理(不在這裏:http://www.lua.org/manual/5.2/manual.html#pdf-string.dump)。另外,在我的第一個例子中,_ENV是否會返回預期行爲? – Paul
您可以閱讀關於debug.getupvalue [here](http://www.lua.org/manual/5.2/manual.html#pdf-debug.setupvalue)的文章。我不確定你的第一個例子中的交易是什麼,因爲它甚至不應該編譯。你正在使用load(),但實際上應該使用loadstring()。加載需要一個func和一個字符串。 –
不再。 Lua 5.2已經棄用'loadstring'並且只對字符串和函數使用'load':然而,http://www.lua.org/manual/5.2/manual.html#8.2'loadstring'仍然可用,並且給出了與'load'相同的結果。再次感謝! – Paul