Enumerable Patterns
Each With Index
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
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
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 label7endlabel ← 1:red
pass 1 of 34items.each_with_index do |itemred, index0|5 label→ 1:red = "#{index0 + start_number1}:#{itemred}"6 puts label1:red7endoutput1:redAll 3 passes — pass 1 is the card above pass itemindexitemslabel1 red 0 — 1:red 2 blue 1 — 2:blue 3 green 2 ["red", "blue", "green"] 3:green
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 label7endlabel ← 0:red
pass 1 of 34items.each_with_index do |itemred, index0|5 label→ 0:red = "#{index0 + start_number0}:#{itemred}"6 puts label0:red7endoutput0:redAll 3 passes — pass 1 is the card above pass itemindexitemslabel1 red 0 — 0:red 2 blue 1 — 1:blue 3 green 2 ["red", "blue", "green"] 2:green
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 label7endlabel ← 5:red
pass 1 of 34items.each_with_index do |itemred, index0|5 label→ 5:red = "#{index0 + start_number5}:#{itemred}"6 puts label5:red7endoutput5:redAll 3 passes — pass 1 is the card above pass itemindexitemslabel1 red 0 — 5:red 2 blue 1 — 6:blue 3 green 2 ["red", "blue", "green"] 7:green