目次
for文の基本 / 減少ループ(カウントダウン) / ステップ指定(間引き)/
配列風テーブルのループ / break(ループを途中で終了する) /
ネストしたwhileとbreakの挙動 / continue相当の処理 / gotoによるcontinue(Lua 5.2以降)
for文とは
※Luaのfor文は、数値でループするNumeric forと、テーブルなどを走査するGeneric forの2種類があります。本記事ではまず、基本となるNumeric forを解説します。
| for 変数 = 開始値, 終了値, 増減値 do 処理 end |
- 指定された数の分、同じ処理を繰り返します
- 増減値は省略可能(省略時は +1)
- ループ変数は自動でlocalになる(スコープはfor内のみ)
- 数値でループするNumeric forです
for文のサンプル
for文の基本
for i = 1, 3 do
print(i) -- 1 2 3
end
減少ループ(カウントダウン)
for i = 3, 1, -1 do
print(i) -- 3 2 1
end
ステップ指定(間引き)
for i = 1, 5, 2 do
print(i) -- 1 3 5
end
配列風テーブルのループ
Luaには配列型は存在せず、テーブルで表現します。
インデックスでループ
local arr = {"red", "yellow", "blue"}
for i = 1, #arr do
print(i, arr[i]) -- 1 red 2 yellow 3 blue
end
3行目の#arrの注意点
#arrはテーブルの長さを返す演算子ですが、連続した整数キー(1,2,3…)の場合のみ安全に使えます。
例えば以下は注意が必要です
local arr = { [1]="A", [3]="C" }
print(#arr) -- 未定義に近い動作(期待通りにならない)
実務では
配列用途 → # OK
疎なテーブル → pairsを使う
と使い分けます。
break (ループを途中で終了する)
for i = 1 , 3 do
if i == 2 then
break
end
print(i) -- 1
end
breakはループを即終了
ネストしたforとbreakの挙動
for i = 1 , 2 do
for j = 1 , 2 do
if j == 1 then
break
end
print(j) -- 出力なし
end
print(i) -- 1 2
end
- breakは内側のfor文のみ終了
- 外側のfor文には影響しない
continue相当の処理
Luaにはcontinueがありません。
ifで制御します。
for i = 1, 3 do
if i ~= 2 then
print(i) -- 1 3
end
end
gotoによるcontinue(Lua 5.2以降)
Lua 5.2以降では goto が使えます。
ただし、可読性が下がるため 基本は非推奨です。
for i = 1, 3 do
if i == 2 then
goto continue
end
print(i) -- 1 3
::continue::
end
Generic forとは
Generic forとは、ipairs、pairs、自作関数などのイテレータ関数を使うループ構文です。
Generic forの例
ipairsを使う
local arr = {"red", "yellow", "blue"}
for i, v in ipairs(arr) do
print(i, v) -- 1 red 2 yellow 3 blue
end
ipairsの用途:連続した整数キー(配列)を順番に走査
また、ipairsはnilに当たった時点で走査を止まります。
pairsを使う
local t = {a="A", b="B"}
for k, v in pairs(t) do
print(k, v) -- a A b B
end
※pairsの出力順序は保証されません。
pairsの用途:すべてのキーを走査(順序不定)
Numeric forとGeneric forの違い
| 種類 | 用途 |
|---|---|
| Numeric for | 数値カウンタでループ ・回数ループ(例:10回処理) ・インデックス操作が必要 ・範囲指定(1〜N) |
| Generic for | テーブルやイテレータを走査 ・配列の走査 ・テーブル処理 ・データ一覧処理 |
関連の記事
