Lua for文 処理を繰り返すサンプル(break/continue)

目次

for文とは

for文のサンプル

for文の基本 / 減少ループ(カウントダウン) / ステップ指定(間引き)/
配列風テーブルのループ / break(ループを途中で終了する) /
ネストしたwhileとbreakの挙動 / continue相当の処理 / gotoによるcontinue(Lua 5.2以降)

Generic forとは

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 テーブルやイテレータを走査
・配列の走査
・テーブル処理
・データ一覧処理

関連の記事

Lua if文のサンプル
Lua while文のサンプル(break/continue)

△上に戻る