Lua学習の閉パッケージ概念
Luaの反復器を学ぶときに閉包の概念がありますが、これは特別です.
Luaの関数は1次値であり,すなわち関数はパラメータとして,戻り値として,変数に右値として与えることができる.変数を定義するように、1つの関数内で関数を再定義できます.内部関数は外部関数のローカル変数にアクセスできます.この変数はupvalueとも呼ばれます.閉包の実現の鍵はこのupvalueである.
関数と閉パッケージの違いを簡単に区別します.関数は特殊な閉パケットであり,閉パケットは関数ではないと言える.閉パッケージは、関数と実行環境の全体です.
例を書きます.
私の理解は、閉パッケージは関数と彼のupvalueからなる全体です.このupvalue変数がどのように実現されているのか分かりませんが、ネット上ではこの変数がスタックに保存され、呼び出されるとそのコピーが作成されるという資料があります.いずれにしても、閉パッケージの外在的な表現はこのupvalue変数を保存することができ、後続の呼び出しはこの変数にアクセスすることができます.
興味があればソース実装を見ることができます.
はっきり言ったかどうか分からないので、メモにしましょう.
Luaの関数は1次値であり,すなわち関数はパラメータとして,戻り値として,変数に右値として与えることができる.変数を定義するように、1つの関数内で関数を再定義できます.内部関数は外部関数のローカル変数にアクセスできます.この変数はupvalueとも呼ばれます.閉包の実現の鍵はこのupvalueである.
関数と閉パッケージの違いを簡単に区別します.関数は特殊な閉パケットであり,閉パケットは関数ではないと言える.閉パッケージは、関数と実行環境の全体です.
例を書きます.
function newCounter()
local i = 0
return function()
i = i+1
return i
end
end
c1=newCounter()
print(c1())
print(c1())
このコードを見て、匿名関数はupvalue iにアクセスし、この変数はカウンタを保存するために使用されます.1回目の呼び出し時に必ず1が印刷されます.2回目の呼び出しはどのくらい印刷されますか.答えは2です.私の理解は、閉パッケージは関数と彼のupvalueからなる全体です.このupvalue変数がどのように実現されているのか分かりませんが、ネット上ではこの変数がスタックに保存され、呼び出されるとそのコピーが作成されるという資料があります.いずれにしても、閉パッケージの外在的な表現はこのupvalue変数を保存することができ、後続の呼び出しはこの変数にアクセスすることができます.
興味があればソース実装を見ることができます.
はっきり言ったかどうか分からないので、メモにしましょう.