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