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