each_with_index gives a block both the current value and its position.

index-aware iteration Index-aware iteration is useful when output depends on position as well as value.

Each With Index

start_number
each_with_index.rb
Replay: real traced execution (multi-file project)
start_number = 1
items = ["red", "blue", "green"]

items.each_with_index do |item, index|
  label = "#{index + start_number}:#{item}"
  puts label
end
start_number = 0
items = ["red", "blue", "green"]

items.each_with_index do |item, index|
  label = "#{index + start_number}:#{item}"
  puts label
end
start_number = 5
items = ["red", "blue", "green"]

items.each_with_index do |item, index|
  label = "#{index + start_number}:#{item}"
  puts label
end
  1. start_number ← 1, items ← ["red", "blue", "green"]

    1start_number→ 1 = 1  #@start_number=0, 52items→ ["red", "blue", "green"] = ["red", "blue", "green"]34items["red", "blue", "green"].each_with_index do |item, index|5  label = "#{index + start_number}:#{item}"6  puts label7end
  2. label ← 1:red

    pass 1 of 3
    4items.each_with_index do |itemred, index0|5  label→ 1:red = "#{index0 + start_number1}:#{itemred}"6  puts label1:red7end
    output1:red
    All 3 passes — pass 1 is the card above
    passitemindexitemslabel
    1red01:red
    2blue12:blue
    3green2["red", "blue", "green"]3:green
  1. start_number ← 0, items ← ["red", "blue", "green"]

    1start_number→ 0 = 02items→ ["red", "blue", "green"] = ["red", "blue", "green"]34items["red", "blue", "green"].each_with_index do |item, index|5  label = "#{index + start_number}:#{item}"6  puts label7end
  2. label ← 0:red

    pass 1 of 3
    4items.each_with_index do |itemred, index0|5  label→ 0:red = "#{index0 + start_number0}:#{itemred}"6  puts label0:red7end
    output0:red
    All 3 passes — pass 1 is the card above
    passitemindexitemslabel
    1red00:red
    2blue11:blue
    3green2["red", "blue", "green"]2:green
  1. start_number ← 5, items ← ["red", "blue", "green"]

    1start_number→ 5 = 52items→ ["red", "blue", "green"] = ["red", "blue", "green"]34items["red", "blue", "green"].each_with_index do |item, index|5  label = "#{index + start_number}:#{item}"6  puts label7end
  2. label ← 5:red

    pass 1 of 3
    4items.each_with_index do |itemred, index0|5  label→ 5:red = "#{index0 + start_number5}:#{itemred}"6  puts label5:red7end
    output5:red
    All 3 passes — pass 1 is the card above
    passitemindexitemslabel
    1red05:red
    2blue16:blue
    3green2["red", "blue", "green"]7:green