【18】pairsとiPairs

pairs and ipairs

pairs()ipairs() は、for ループを使用して、開始値や終了値を指定することなく配列や連想配列の各要素を処理することができる特殊な関数です。ipairs() の 「i」 は「インデックス」 を意味します。

local myDictionary = {
    ["Blue Player"] = "Ana",
    ["Gold Player"] = "Binh",
    ["Red Player"] = "Cate",
}
 
for key, value in pairs(myDictionary) do
    print(key .. " is " .. value)
end
local myArray = {"Ana", "Binh", "Cate"}
 
for index, value in ipairs(myArray) do
    print("Player " .. index .. " is " .. value)
end

連想配列とpairs

pairs() は、連想配列のキー、値、またはその両方を操作できます。以下の for ループでは、最初の変数(itemName)がキーになり、2 番目の変数(itemValue)が値になります。pairs() には処理したい連想配列(inventory)を渡します。

local inventory = { 
    ["Gold Bricks"] = 43,
    Carrots = 3,
    Torches  = 2,
}
    
print("You have:")
 
for itemName, itemValue in pairs(inventory) do
    print(itemValue, itemName)
end

配列とipairs

ipairs() の 「i」 は「インデックス」 であることを覚えておいてください。リーダーボードのような順序付きの値を扱うには、ipairs() と配列を for ループと組み合わせて使用します。下記の playerIndex には、1、2、3のインデックス値が入ります。

local players = {"Ali", "Ben", "Cammy"}
 
for playerIndex, playerName in ipairs(players) do
    print(playerIndex .. " is " .. playerName)
end

練習 ー レストラン・スープシミュレーター

プレイヤーが、提供されたスープの材料から選択することができるレストラン・シミュレーターのスープの部分を作ってみましょう。材料はそのままキーとして保存し、プレーヤーが選択したものを true に設定します。pairs() を使って何が選択されたのかを確認し、ipairs() を使って材料のリストを表示します。

  1. menu という名前の新しい連想配列を作成します。キーが材料で、値が false である3~5個のキーと値のペアを追加します。
-- スープの具材
local menu = {
    cabbage = false,
    ["chocolate sauce"] = false,
    beef = false,
    tomato = false,
    noodles = false,
}
  1. 顧客が選択した材料を追加できるように、空の配列を用意しておきます。
-- お客さんのスープ
local isInSoup = {}
  1. pairs() を使用して、連想配列の値が true false かをチェックします。true の場合は、その材料をスープ(isInSoup)に追加します。
-- お客さんのスープ
local isInSoup = {}
 
-- お客さんの選んだ具材をスープに追加
for menuChoice, value in pairs(menu) do
    if value then
        table.insert(isInSoup, menuChoice)
    end
end
  1. 注文された材料リストを表示します。
  • isInSoup に材料が追加されているか確認します。配列の要素数を調べるには配列名の前に「#」を付けます。1つ以上追加されていれば、”You ordered soup with:”というメッセージを表示します。
  • ipairs() を使用して isInSoup の配列の値を取得し、材料を表示します。
  • いくつか、menu の材料を true に変更してテストします。
-- スープの具材
local menu = {
    cabbage = true,
    ["chocolate sauce"] = true,
    beef = false,
    tomato = false,
    noodles = true,
}
 
-- お客さんのスープ
local isInSoup = {}
 
-- お客さんの選んだ具材をスープに追加
for menuChoice, value in pairs(menu) do
    if value then
        table.insert(isInSoup, menuChoice)
    end
end
 
-- 「isInSoup」からのスープの注文を表示
if #isInSoup >= 1 then
    print("You ordered soup with: ")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
end
  1. 材料が1つも選択されていない場合は、else を使って顧客に伝えるメッセージ表示します。
-- スープの具材
local menu = {
    cabbage = true,
    ["chocolate sauce"] = true,
    beef = false,
    tomato = false,
    noodles = true,
}
 
-- お客さんのスープ
local isInSoup = {}
 
-- お客さんの選んだ具材をスープに追加
for menuChoice, value in pairs(menu) do
    if value then
        table.insert(isInSoup, menuChoice)
    end
end
 
-- 「isInSoup」からのスープの注文を表示
if #isInSoup >= 1 then
    print("You ordered soup with: ")
    for index, soupIngredient in ipairs(isInSoup) do
        print(soupIngredient)
    end
else
    print("Nothing was selected. Are you not hungry?")
end

コメントを残す