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

middle
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)
  1. middle ← blue, chosenIndex ← 0, chosenColor ← (empty)

    1local middle→ blue = "blue" --@middle="green", "gold"2local chosenIndex→ 0 = 03local chosenColor→ (empty) = ""
  2. index, color in ipairs({"red", middle, "purple"}) do

    pass 1 of 3
    5for index1, colorred in ipairs({"red", middleblue, "purple"}) do6  if color == middle then7    chosenIndex = index
    All 3 passes — pass 1 is the card above
    passindexcolorchosenIndexchosenColor
    11red
    22blue2blue
    33purple
  3. chosenIndex ← 2, chosenColor ← blue

    5for index, color in ipairs({"red", middle, "purple"}) do6  if colorblue == middleblue then7    chosenIndex→ 2 = index28    chosenColor→ blue = colorblue9  end
  4. print("middle=" .. middle)

    12print("middle=" .. middleblue)13print("chosenIndex=" .. chosenIndex2)14print("chosenColor=" .. chosenColorblue)
    outputmiddle=blue
    chosenIndex=2
    chosenColor=blue
  1. middle ← green, chosenIndex ← 0, chosenColor ← (empty)

    1local middle→ green = "green"2local chosenIndex→ 0 = 03local chosenColor→ (empty) = ""
  2. index, color in ipairs({"red", middle, "purple"}) do

    pass 1 of 3
    5for index1, colorred in ipairs({"red", middlegreen, "purple"}) do6  if color == middle then7    chosenIndex = index
    All 3 passes — pass 1 is the card above
    passindexcolorchosenIndexchosenColor
    11red
    22green2green
    33purple
  3. chosenIndex ← 2, chosenColor ← green

    5for index, color in ipairs({"red", middle, "purple"}) do6  if colorgreen == middlegreen then7    chosenIndex→ 2 = index28    chosenColor→ green = colorgreen9  end
  4. print("middle=" .. middle)

    12print("middle=" .. middlegreen)13print("chosenIndex=" .. chosenIndex2)14print("chosenColor=" .. chosenColorgreen)
    outputmiddle=green
    chosenIndex=2
    chosenColor=green
  1. middle ← gold, chosenIndex ← 0, chosenColor ← (empty)

    1local middle→ gold = "gold"2local chosenIndex→ 0 = 03local chosenColor→ (empty) = ""
  2. index, color in ipairs({"red", middle, "purple"}) do

    pass 1 of 3
    5for index1, colorred in ipairs({"red", middlegold, "purple"}) do6  if color == middle then7    chosenIndex = index
    All 3 passes — pass 1 is the card above
    passindexcolorchosenIndexchosenColor
    11red
    22gold2gold
    33purple
  3. chosenIndex ← 2, chosenColor ← gold

    5for index, color in ipairs({"red", middle, "purple"}) do6  if colorgold == middlegold then7    chosenIndex→ 2 = index28    chosenColor→ gold = colorgold9  end
  4. print("middle=" .. middle)

    12print("middle=" .. middlegold)13print("chosenIndex=" .. chosenIndex2)14print("chosenColor=" .. chosenColorgold)
    outputmiddle=gold
    chosenIndex=2
    chosenColor=gold

Follow the Index

  1. middle starts as blue.
  2. The loop visits red, blue, and purple in order.
  3. ipairs gives blue index 2.
  4. The if color == middle branch records index 2.
  5. 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.