5-5 pairs と ipairs

ここでは for ループを使って、配列や辞書の要素を取り出していく方法を学びます。
今まで学んだ for 文は、開始値、終了値、増減値を指定しましたが、配列や辞書を扱う for はこれとは少々異なります。「pairs」(ペアーズ)、「ipairs」(アイペアーズ)というキーワードを使用しての操作になります。

辞書とpairs()

pairs()は、辞書で使用されます。以下に例を示します。今までの for とは全く異なるのが分かると思います。

local myDictionary = {
    ["Blue Player"] = "Ana",
    ["Gold Player"] = "Binh",
    ["Red Player"] = "Cate",
}

for key, value in pairs(myDictionary) do
    print(key .. " is " .. value)
end

for に続いて変数を、カンマで区切り、2つ目の変数を、「in pairs(辞書名) 」と続きます。その後ろの do から end までは通常の for 文と全く同じです。
最初の変数 key にはキー名が入り、次の value にはその値が入ります。すべての要素が取り出されるまで、do から end 内をループします。

local inventory = {
    ["Gold Bricks"] = 43,
    Carrots = 3,
    Torches  = 2,
}

print("You have:")

for itemName, itemValue in pairs(inventory) do
    print(itemName, itemValue)
end

こちらを実行すると、次のように表示されると思います。表示の順番を確認してください。辞書の場合、必ずしも inventory で初期化した順番にならないということになります。

You have:
Carrots 3
Gold Bricks 43
Torches 2

配列と ipairs()

ipairs() は配列で使用されます。ipairs()の頭の「i」は「インデックス」を表します。使用方法は辞書のときと同じです。配列の場合は、キー名ではなくインデックス番号が取得できます。

local players = { "Ali", "Ben", "Cammy" }

for playerRank, playerName in ipairs(players) do
    print("Winner #" .. playerRank .. " is " .. playerName)
end

実行すると、次のように表示されます。配列の場合は必ず初期化した順番通りになります。

Winner #1 is Ali
Winner #2 is Ben
Winner #3 is Cammy

辞書と配列を組み合わせた例

スープの具材を辞書に登録しておき、お客さんが選んだものをスープのリストに追加していくという処理を考えてみましょう。
スープの具材は辞書になりますので pairs() を使用します。スープのリストは配列になりますので ipairs() を使うことになります。

  1. menu という名前の辞書を作成します。キーを具材、値は追加するかどうかを示します。true が 追加する具材になり、false が追加しない具材になります。まずは、すべてfalseに設定しておき、動作テストを行います。
local menu = {
    cabbage = false,    -- キャベツ
    beef = false,       -- 牛肉
    tomato = false,     -- トマト
    noodles = false,    -- 麺
}
  1. menu の下に、空の配列を追加します。この配列には、お客さんが追加した具材が入ります。
-- お客様が追加したスープの具材
local isInSoup = {}
  1. pairs() を使用して、辞書内の要素を確認します。その具材が true の場合、それをスープのリストに追加します。
-- お客様が追加したスープの具材
local isInSoup = {}

-- スープにお客様の選択肢を追加
for menuChoice, value in pairs(menu) do
    if value then
        table.insert(isInSoup, menuChoice)
    end
end
  1. 最後に顧客に注文を繰り返します。プログラムは、次のようにコーディングします。
  • isInSoup に具材が入っているかどうかを確認します。もし1つでも入っていたら 「ご注文のスープの具材は」を表示します。
  • 次に、ipairs() を使用して isInSoup 配列に入っている具材を表示します。
  • まず、このまま実行してみましょう。1つも表示しないはずです。
  • 次に、少なくとも menu 内のどれか1つを true に変更してみましょう。その具材が表示するはずです。
-- isInSoup からスープの順番を表示する
if isInSoup then
    print("ご注文のスープの具材は")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
    print("です。")
end
  1. 具材を1つも選んでいなかった場合のために else 文を追加します。そして、それにふさわしいメッセージを表示してみましょう。
    ちなみに、isInSoup が空だった場合の条件式は「if not isInSoup then」と記述することができます。
if isInSoup then
    print("ご注文のスープの具材は")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
    print("です。")
else
    print("具材を入れないスープでよろしいでしょうか?")
end

コメントを残す