Iterators and Generic For
Ipairs Index
ipairs yields each array-style entry with its numeric index.
index and value
Use `ipairs` when sequence order matters and each loop step needs both the index and the value.
Ipairs Index
ipairs_index.lua
Replay: real traced execution (multi-file project)
local middle = "blue"
local chosenIndex = 0
local chosenColor = ""
for index, color in ipairs({"red", middle, "purple"}) do
if color == middle then
chosenIndex = index
chosenColor = color
end
end
print("middle=" .. middle)
print("chosenIndex=" .. chosenIndex)
print("chosenColor=" .. chosenColor)
local middle = "green"
local chosenIndex = 0
local chosenColor = ""
for index, color in ipairs({"red", middle, "purple"}) do
if color == middle then
chosenIndex = index
chosenColor = color
end
end
print("middle=" .. middle)
print("chosenIndex=" .. chosenIndex)
print("chosenColor=" .. chosenColor)
local middle = "gold"
local chosenIndex = 0
local chosenColor = ""
for index, color in ipairs({"red", middle, "purple"}) do
if color == middle then
chosenIndex = index
chosenColor = color
end
end
print("middle=" .. middle)
print("chosenIndex=" .. chosenIndex)
print("chosenColor=" .. chosenColor)
middle ← blue, chosenIndex ← 0, chosenColor ← (empty)
1local middle→ blue = "blue" --@middle="green", "gold"2local chosenIndex→ 0 = 03local chosenColor→ (empty) = ""index, color in ipairs({"red", middle, "purple"}) do
pass 1 of 35for index1, colorred in ipairs({"red", middleblue, "purple"}) do6 if color == middle then7 chosenIndex = indexAll 3 passes — pass 1 is the card above pass indexcolorchosenIndexchosenColor1 1 red — — 2 2 blue 2 blue 3 3 purple — — chosenIndex ← 2, chosenColor ← blue
5for index, color in ipairs({"red", middle, "purple"}) do6 if colorblue == middleblue then7 chosenIndex→ 2 = index28 chosenColor→ blue = colorblue9 endprint("middle=" .. middle)
12print("middle=" .. middleblue)13print("chosenIndex=" .. chosenIndex2)14print("chosenColor=" .. chosenColorblue)outputmiddle=blue chosenIndex=2 chosenColor=blue
middle ← green, chosenIndex ← 0, chosenColor ← (empty)
1local middle→ green = "green"2local chosenIndex→ 0 = 03local chosenColor→ (empty) = ""index, color in ipairs({"red", middle, "purple"}) do
pass 1 of 35for index1, colorred in ipairs({"red", middlegreen, "purple"}) do6 if color == middle then7 chosenIndex = indexAll 3 passes — pass 1 is the card above pass indexcolorchosenIndexchosenColor1 1 red — — 2 2 green 2 green 3 3 purple — — chosenIndex ← 2, chosenColor ← green
5for index, color in ipairs({"red", middle, "purple"}) do6 if colorgreen == middlegreen then7 chosenIndex→ 2 = index28 chosenColor→ green = colorgreen9 endprint("middle=" .. middle)
12print("middle=" .. middlegreen)13print("chosenIndex=" .. chosenIndex2)14print("chosenColor=" .. chosenColorgreen)outputmiddle=green chosenIndex=2 chosenColor=green
middle ← gold, chosenIndex ← 0, chosenColor ← (empty)
1local middle→ gold = "gold"2local chosenIndex→ 0 = 03local chosenColor→ (empty) = ""index, color in ipairs({"red", middle, "purple"}) do
pass 1 of 35for index1, colorred in ipairs({"red", middlegold, "purple"}) do6 if color == middle then7 chosenIndex = indexAll 3 passes — pass 1 is the card above pass indexcolorchosenIndexchosenColor1 1 red — — 2 2 gold 2 gold 3 3 purple — — chosenIndex ← 2, chosenColor ← gold
5for index, color in ipairs({"red", middle, "purple"}) do6 if colorgold == middlegold then7 chosenIndex→ 2 = index28 chosenColor→ gold = colorgold9 endprint("middle=" .. middle)
12print("middle=" .. middlegold)13print("chosenIndex=" .. chosenIndex2)14print("chosenColor=" .. chosenColorgold)outputmiddle=gold chosenIndex=2 chosenColor=gold
Follow the Index
middlestarts asblue.- The loop visits
red,blue, andpurplein order. ipairsgivesblueindex2.- The
if color == middlebranch records index2. - It also records chosen color
blue. | index | color | matches middle? | | --- | --- | --- | | 1 | red | no | | 2 | blue | yes | | 3 | purple | no |
Exercise: ipairs_index.lua
Reproduce middle=blue, chosenIndex=2, and chosenColor=blue, then use the pinned middle variants green and gold to predict chosenIndex=2 with chosenColor=green and chosenColor=gold.