汎用ゲームエディター『Multimedia Fusion2』 6
■ このスレッドは過去ログ倉庫に格納されています
0670名前は開発中のものです。
2010/09/07(火) 11:32:35ID:d5KcFu2+local a = 0 -- このローカル変数は毎回新しく作られる
return function () -- 関数fの返り値は無名関数
a = a + 10
return a -- 呼び出されるごとにカウントアップした値を返す
end
end
v = f(); print v(); print v(); -- 順に10,20と表示
w = f(); print w(); print v(); -- 順に10,30と表示 w,vが独立して動いていることが分かる
このスクリプトによって関数fが定義されます。
厳密にはLuaの関数はすべて無名なので、変数fに無名関数が代入されたというのが正確です。
したがって1行目は f = function () ... end と書き換えられます(というか本当はこちらが正しいです)。
この関数fを呼び出すと無名関数が返されます。
なのでこれを変数vに代入すると、v = funtion () ... end と解釈され、あたかも関数vが定義されたかのように振る舞います。
詳細な説明は省きますが、ローカル変数aは破棄されないので、関数vは思惑通り正常に動きます。
ここで新たに関数fを呼び出して、返り値の無名関数を変数wに代入するとします。
先ほどと同じくwも関数のように振る舞いますが、ローカル変数aは関数fが呼び出されるたびに新しく定義されるため、
vとwとはそれぞれ独立して動きます。いろいろ試してみてください。
v,wなどの代わりに、オブジェクトの文字列変数や通し番号を用いれば、ちょっと嬉しいこともできます。
-- おまけのへんてこなサンプル
a = print; a("テキスト"); -- printに別名を与えてみた
print = pow; a(print(2, 4)); -- printを別の関数と関連づけてみた
■ このスレッドは過去ログ倉庫に格納されています