Control Flow
Times and Each
Ruby offers friendly iterator methods such as times and each.
iterator block
Iterator methods run a block once for each value they produce.
Times and Each
times_each.rb
Replay: real traced execution (multi-file project)
count = 3
labels = []
count.times do |index|
labels << "item#{index + 1}"
end
labels.each do |label|
puts label
end
count = 2
labels = []
count.times do |index|
labels << "item#{index + 1}"
end
labels.each do |label|
puts label
end
count = 5
labels = []
count.times do |index|
labels << "item#{index + 1}"
end
labels.each do |label|
puts label
end
count ← 3, labels ← []
1count→ 3 = 3 #@count=2, 52labels→ [] = []34count3.times do |index|5 labels << "item#{index + 1}"6enddo |index|
pass 1 of 34count.times do |index0|5 labels << "item#{index + 1}"6endAll 3 passes — pass 1 is the card above pass indexcount1 0 — 2 1 — 3 2 3 labels.each do |label|
8labels["item1", "item2", "item3"].each do |label|9 puts label10enddo |label|
pass 1 of 38labels.each do |labelitem1|9 puts labelitem110endoutputitem1All 3 passes — pass 1 is the card above pass labellabels1 item1 — 2 item2 — 3 item3 ["item1", "item2", "item3"]
count ← 2, labels ← []
1count→ 2 = 22labels→ [] = []34count2.times do |index|5 labels << "item#{index + 1}"6enddo |index|
pass 1 of 24count.times do |index0|5 labels << "item#{index + 1}"6enddo |index|
pass 2 of 24count2.times do |index1|5 labels << "item#{index + 1}"6endlabels.each do |label|
8labels["item1", "item2"].each do |label|9 puts label10enddo |label|
pass 1 of 28labels.each do |labelitem1|9 puts labelitem110endoutputitem1do |label|
pass 2 of 28labels["item1", "item2"].each do |labelitem2|9 puts labelitem210endoutputitem2
count ← 5, labels ← []
1count→ 5 = 52labels→ [] = []34count5.times do |index|5 labels << "item#{index + 1}"6enddo |index|
pass 1 of 54count.times do |index0|5 labels << "item#{index + 1}"6endAll 5 passes — pass 1 is the card above pass indexcount1 0 — 2 1 — 3 2 — 4 3 — 5 4 5 labels.each do |label|
8labels["item1", "item2", "item3", "item4", "item5"].each do |label|9 puts label10enddo |label|
pass 1 of 58labels.each do |labelitem1|9 puts labelitem110endoutputitem1All 5 passes — pass 1 is the card above pass labellabels1 item1 — 2 item2 — 3 item3 — 4 item4 — 5 item5 ["item1", "item2", "item3", "item4", "item5"]
Build Labels, Then Print
countstarts at3.count.timesruns with indexes0,1, and2.- Each pass appends one label to
labels. labels.eachprints each label. | Index | Label appended | | --- | --- | |0|item1| |1|item2| |2|item3|
Exercise: times_each.rb
Use times to build item labels, then use each to print every label