[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 13:15 / Filesize : 238 KB / Number-of Response : 818
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

汎用ゲームエディター『Multimedia Fusion2』 6



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を別の関数と関連づけてみた






[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<238KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef