ここでは 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() を使うことになります。
- menu という名前の辞書を作成します。キーを具材、値は追加するかどうかを示します。true が 追加する具材になり、false が追加しない具材になります。まずは、すべてfalseに設定しておき、動作テストを行います。
local menu = {
cabbage = false, -- キャベツ
beef = false, -- 牛肉
tomato = false, -- トマト
noodles = false, -- 麺
}
- menu の下に、空の配列を追加します。この配列には、お客さんが追加した具材が入ります。
-- お客様が追加したスープの具材
local isInSoup = {}
- pairs() を使用して、辞書内の要素を確認します。その具材が true の場合、それをスープのリストに追加します。
-- お客様が追加したスープの具材
local isInSoup = {}
-- スープにお客様の選択肢を追加
for menuChoice, value in pairs(menu) do
if value then
table.insert(isInSoup, menuChoice)
end
end
- 最後に顧客に注文を繰り返します。プログラムは、次のようにコーディングします。
- 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つも選んでいなかった場合のために else 文を追加します。そして、それにふさわしいメッセージを表示してみましょう。
ちなみに、isInSoup が空だった場合の条件式は「if not isInSoup then」と記述することができます。
if isInSoup then
print("ご注文のスープの具材は")
for index, soupIngredient in ipairs(isInSoup) do
print(soupIngredient)
end
print("です。")
else
print("具材を入れないスープでよろしいでしょうか?")
end
[ 5-4 辞書の概要 ]
[ 5-6 辞書から値を見つける ]