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

count
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
  1. count ← 3, labels ← []

    1count→ 3 = 3  #@count=2, 52labels→ [] = []34count3.times do |index|5  labels << "item#{index + 1}"6end
  2. do |index|

    pass 1 of 3
    4count.times do |index0|5  labels << "item#{index + 1}"6end
    All 3 passes — pass 1 is the card above
    passindexcount
    10
    21
    323
  3. labels.each do |label|

    8labels["item1", "item2", "item3"].each do |label|9  puts label10end
  4. do |label|

    pass 1 of 3
    8labels.each do |labelitem1|9  puts labelitem110end
    outputitem1
    All 3 passes — pass 1 is the card above
    passlabellabels
    1item1
    2item2
    3item3["item1", "item2", "item3"]
  1. count ← 2, labels ← []

    1count→ 2 = 22labels→ [] = []34count2.times do |index|5  labels << "item#{index + 1}"6end
  2. do |index|

    pass 1 of 2
    4count.times do |index0|5  labels << "item#{index + 1}"6end
  3. do |index|

    pass 2 of 2
    4count2.times do |index1|5  labels << "item#{index + 1}"6end
  4. labels.each do |label|

    8labels["item1", "item2"].each do |label|9  puts label10end
  5. do |label|

    pass 1 of 2
    8labels.each do |labelitem1|9  puts labelitem110end
    outputitem1
  6. do |label|

    pass 2 of 2
    8labels["item1", "item2"].each do |labelitem2|9  puts labelitem210end
    outputitem2
  1. count ← 5, labels ← []

    1count→ 5 = 52labels→ [] = []34count5.times do |index|5  labels << "item#{index + 1}"6end
  2. do |index|

    pass 1 of 5
    4count.times do |index0|5  labels << "item#{index + 1}"6end
    All 5 passes — pass 1 is the card above
    passindexcount
    10
    21
    32
    43
    545
  3. labels.each do |label|

    8labels["item1", "item2", "item3", "item4", "item5"].each do |label|9  puts label10end
  4. do |label|

    pass 1 of 5
    8labels.each do |labelitem1|9  puts labelitem110end
    outputitem1
    All 5 passes — pass 1 is the card above
    passlabellabels
    1item1
    2item2
    3item3
    4item4
    5item5["item1", "item2", "item3", "item4", "item5"]

Build Labels, Then Print

  1. count starts at 3.
  2. count.times runs with indexes 0, 1, and 2.
  3. Each pass appends one label to labels.
  4. labels.each prints 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