- 追加された行はこの色です。
- 削除された行はこの色です。
[[lua_reference_watch_out_point]]
*Luaリファレンス 要注意点 ~イタレータ~ [#j915ac6a]
*イタレータ [#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 単位でクロージャがリセットされるので期待通りの挙動となる。~
このように2回繰り返しても、~
ちゃんとfor in 単位でクロージャがリセットされるので期待通りの挙動となる。~
~
以下のようにvtを用意してしまうと、当然変数寿命が維持されてしまい、上手く動かなくなるので注意
以下のように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)''と順に繰り返してゆく。~