- 670 名前:名前は開発中のものです。 mailto:sage [2010/09/07(火) 11:32:35 ID:d5KcFu2+]
- function f ()
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を別の関数と関連づけてみた
|

|