for .. in 構文
Pythonでは、多値とリストとジェネレータが「for .. in 構文」では同一として扱える。しかし、Luaでは同一として扱えない。Luaでは、「for .. in _」の「_」の部分に、値を返す関数を必要とする。例えば以下のよう。
> function f() >> return 1 >> end > for v in f do >> print(v) >> end 1 1 1 ... // 無限に1を返す
そこで、次のようにする必要がある。nilまで繰り返す。
-- 例1 function f() local i = 1 local values = {1, 2, 3} return function () local v = values[i] i = i + 1 return v end end for i in f() do print(i) end -- 実行結果 1 2 3
-- 例2 function f() coroutine.yield(1) coroutine.yield(2) coroutine.yield(3) end for i in coroutine.wrap(f) do print(i) end -- 実行結果 1 2 3
ちなみに、多値をジェネレータに変換するには、以下のようにやる。
function f() return 1,2,3 end for i,v in ipairs({f()}) do print(v) end -- 実行結果 1 2 3