5-5 pairs と ipairs

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

辞書とpairs()

pairs()は、辞書で使用されます。以下に例を示します。

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(itemValue, itemName)
end

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

You have:
3 Carrots
43 Gold Bricks
2 Torches

配列と 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
end
  1. 具材を1つも選んでいなかった場合のために else 文を追加します。そして、それにふさわしいメッセージを表示してみましょう。
    ちなみに、isInSoup が空だった場合の条件式は「if not isInSoup then」と記述することができます。
if isInSoup then
    print("You ordered soup with: ")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
else
    print("何も選択されていませんが、お腹は空いていませんか?")
end

返信を残す