Lua Academy · レッスン

pairsとipairsによるテーブルの反復処理

pairs()とipairs()を使ってテーブルを安全に走査します。

レッスン 3/412 ステップ

「pairsとipairsによるテーブルの反復処理」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

ipairs:順序付き配列反復

ipairs(t)は、インデックス1から始まる整数シーケンスを反復し、(index, value)の組を返します。最初のnilで停止します。順序が重要な配列風テーブルには、安全で予測しやすい選択肢です。

local fruits = {"apple","banana","cherry"}

for i, fruit in ipairs(fruits) do
  print(i, fruit)
end
-- 1  apple
-- 2  banana
-- 3  cherry

pairs:すべてのキー

pairs(t)は、テーブル内のnilではないすべてのキーと値の組を、順序を定めずに反復します。内部ではnext()関数を使います。辞書や混在したテーブル、または型に関係なくすべてのキーを処理する必要がある場合は、pairsを使います。

local info = {name="Lua", version=5.4, embedded=true}

for k, v in pairs(info) do
  print(k, v)
end
-- name  Lua
-- version  5.4
-- embedded  true  (order may vary)

pairsとipairsの使い分け

連続した配列にはipairsを使います(順序が保証され、nilで停止します)。辞書や混在したテーブル、またはすべてのキーが必要な場合はpairsを使います。配列にpairsを使うことはできますが、順序は保証されません。辞書にipairsを使うと、整数以外のキーが処理されません。

local mixed = {10, 20, label="hello", 30}

-- ipairs: only sees 10, 20, 30 in order
for i, v in ipairs(mixed) do
  io.write(v .. " ")
end
print()  -- 10 20 30

-- pairs: sees everything
for k, v in pairs(mixed) do
  print(k, v)
end

要素数のカウント

シーケンスでは#tが要素数を返します。辞書では#tは信頼できないため、pairsで反復して手動で数えます。これは、混在したテーブルや文字列キーのテーブルを扱う際のバグを防ぐ重要な違いです。

local arr = {10, 20, 30}
print("#arr:", #arr)        -- 3 (reliable)

local dict = {a=1, b=2, c=3}
print("#dict:", #dict)      -- 0 (unreliable for dicts!)

local count = 0
for _ in pairs(dict) do count = count + 1 end
print("count:", count)       -- 3

反復中の値の変更

pairsで反復している間に、既存のキーの値を安全に更新できます。ただし、反復中にキーを追加または削除すると、動作は未定義です。変更内容を集めて、ループの後で適用してください。

local prices = {apple=1.0, banana=0.5, cherry=2.0}

-- Safe: update existing values
for k, v in pairs(prices) do
  prices[k] = v * 1.1  -- 10% markup
end

for k, v in pairs(prices) do
  print(k, string.format("%.2f", v))
end

キーの収集

よくある操作として、決定的な出力を得るためにすべてのキーを集め、並べ替えた配列を作成します。pairsでキーを集めてから、table.sortで順序付けします。

local config = {host="localhost", port=8080, debug=true}
local keys = {}

for k in pairs(config) do
  keys[#keys+1] = k
end
table.sort(keys)

for _, k in ipairs(keys) do
  print(k, "=", config[k])
end
-- debug = true
-- host = localhost
-- port = 8080

ネストしたテーブルの反復

ネストしたテーブル(テーブルのテーブル)では、2つのループを組み合わせます。外側のループで最上位を反復し、内側のループで各ネストテーブルを反復します。任意の深さを扱うには、このパターンに再帰を組み合わせます。

local matrix = {
  {1,2,3},
  {4,5,6},
  {7,8,9},
}

for i, row in ipairs(matrix) do
  for j, val in ipairs(row) do
    io.write(string.format("%3d", val))
  end
  print()
end

ipairsによるフィルタリング

ipairsで反復し、述語を満たす要素を追加することで、フィルタリングされたリストを作成します。結果は、一致した要素だけを含む新しい配列です。

local function filter(t, pred)
  local result = {}
  for _, v in ipairs(t) do
    if pred(v) then result[#result+1] = v end
  end
  return result
end

local nums = {1,2,3,4,5,6,7,8,9,10}
local evens = filter(nums, function(n) return n % 2 == 0 end)
print(table.concat(evens, " "))  -- 2 4 6 8 10

ipairsによるマッピング

すべての要素に変換を適用します。要素を反復し、変換後の値で新しい配列を作成します。これは、関数型言語におけるmap()に相当するLuaの処理です。

local function map(t, fn)
  local result = {}
  for i, v in ipairs(t) do
    result[i] = fn(v)
  end
  return result
end

local nums = {1, 2, 3, 4, 5}
local doubled = map(nums, function(n) return n * 2 end)
print(table.concat(doubled, " "))  -- 2 4 6 8 10

local words = {"hello","world"}
local upper = map(words, string.upper)
print(table.concat(upper, " "))    -- HELLO WORLD

カスタムイテレーターでのpairs

関数からイテレーターと状態を返すことで、カスタムオブジェクトを反復可能にできます。このパターンは、pairsが内部で動作する方法に似ています。next, t, nilを返す仕組みです。イテレーターファクトリも同様に、関数とオプションの状態を返します。

local function values(t)
  local i = 0
  return function()
    i = i + 1
    return t[i]
  end
end

for v in values({"x","y","z"}) do
  print(v)
end
-- x
-- y
-- z

クイックチェック

pairs()とipairs()について正しい説明はどれですか?

復習:pairsとipairs

まとめ:

  • ipairs:順序付きで、1から始まる整数キーを処理し、nilで停止します
  • pairs:すべてのキーを任意の順序で処理し、途中で停止しません
  • 辞書にはpairsを、配列にはipairsを使います
  • pairsによる反復中はキーを追加・削除しないでください。既存の値の更新は安全です
  • 決定的な出力が必要な場合は、キーを集めて並べ替えます
無料で開始

AI チューターと学ぶ Lua — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
40
レッスン
159

よくある質問

「pairsとipairsによるテーブルの反復処理」レッスンは無料ですか?

はい。「pairsとipairsによるテーブルの反復処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「pairsとipairsによるテーブルの反復処理」で何を学びますか?

pairs()とipairs()を使ってテーブルを安全に走査します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「pairsとipairsによるテーブルの反復処理」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 配列としてのテーブル
  2. 辞書としてのテーブル
  3. pairsとipairsによるテーブルの反復処理
  4. ネストしたテーブルと構造化データ
← Lua Academyに戻る