*Luaリファレンス 要注意点 ~イタレータ~ [#j915ac6a] **イタレータとクロージャ [#fbc2b632] -python 他と同じ。for in が対応していることも含めて標準的) #sh(lua){{ function values (t) local i=0 return function () i=i+1 return t[i] end end t = {10,20,30} for element in values(t) do print(element) end for element in values(t) do print(element) end }} このように2回繰り返しても、~ ちゃんとfor in 単位でクロージャがリセットされるので期待通りの挙動となる。~ ~ 以下のようにvtを用意してしまうと、当然変数寿命が維持されてしまい、~ 上手く動かなくなるので注意 #sh(lua){{ t = {10,20,30} vt = values(t) for element in vt do print(element) end for element in vt do print(element) end }} ~ **for i, v in func(a) の挙動 [#db7cbde1] >~ #sh(lua){{ for i, v in func(a) end }} などとした場合、~ forは''イタレータを繰り返す道具として、ただ一度「func, a, 制御値(iへの初期値)」を要求し、~ func(a, 制御値)を繰り返す。'' ~ 例えば、ipairsを以下のように実装した時、~ #sh(lua){{ function ipairs (a) return iter, a, 0 end }} とリストを返すようにしておけば、~ 最初に、''for ... in は iter(a, 0)''を呼び出す。~ そして、''iter(a, 1)、iter(a, 2)''と順に繰り返してゆく。~