Enumerable methods such as map and select transform and filter collections.

enumerable Many Ruby collections include Enumerable methods for common traversal patterns.

Enumerable Map Select

minimum
enumerable_map_select.rb
Replay: real traced execution (multi-file project)
numbers = [2, 4, 6, 8]
minimum = 6

doubled = numbers.map do |number|
  number * 2
end

selected = doubled.select do |number|
  number >= minimum
end

puts "doubled=#{doubled.join(",")}"
puts "minimum=#{minimum}"
puts "selected=#{selected.join(",")}"
numbers = [2, 4, 6, 8]
minimum = 4

doubled = numbers.map do |number|
  number * 2
end

selected = doubled.select do |number|
  number >= minimum
end

puts "doubled=#{doubled.join(",")}"
puts "minimum=#{minimum}"
puts "selected=#{selected.join(",")}"
numbers = [2, 4, 6, 8]
minimum = 10

doubled = numbers.map do |number|
  number * 2
end

selected = doubled.select do |number|
  number >= minimum
end

puts "doubled=#{doubled.join(",")}"
puts "minimum=#{minimum}"
puts "selected=#{selected.join(",")}"
  1. numbers ← [2, 4, 6, 8], minimum ← 6

    1numbers→ [2, 4, 6, 8] = [2, 4, 6, 8]2minimum→ 6 = 6  #@minimum=4, 1034doubled = numbers[2, 4, 6, 8].map do |number|5  number * 26end
  2. do |number|

    pass 1 of 4
    4doubled = numbers.map do |number2|5  number * 26end
    All 4 passes — pass 1 is the card above
    passnumbernumbersdoubled
    12
    24
    36
    48[2, 4, 6, 8][4, 8, 12, 16]
  3. selected = doubled.select do |number|

    8selected = doubled[4, 8, 12, 16].select do |number|9  number >= minimum10end
  4. do |number|

    pass 1 of 4
    8selected = doubled.select do |number4|9  number >= minimum10end
    All 4 passes — pass 1 is the card above
    passnumberdoubledselected
    14
    28
    312
    416[4, 8, 12, 16][8, 12, 16]
  5. puts "doubled=#{doubled.join(",")}"

    12puts "doubled=#{doubled.join(",")4,8,12,16}"13puts "minimum=#{minimum6}"14puts "selected=#{selected.join(",")8,12,16}"
    outputdoubled=4,8,12,16
    minimum=6
    selected=8,12,16
  1. numbers ← [2, 4, 6, 8], minimum ← 4

    1numbers→ [2, 4, 6, 8] = [2, 4, 6, 8]2minimum→ 4 = 434doubled = numbers[2, 4, 6, 8].map do |number|5  number * 26end
  2. do |number|

    pass 1 of 4
    4doubled = numbers.map do |number2|5  number * 26end
    All 4 passes — pass 1 is the card above
    passnumbernumbersdoubled
    12
    24
    36
    48[2, 4, 6, 8][4, 8, 12, 16]
  3. selected = doubled.select do |number|

    8selected = doubled[4, 8, 12, 16].select do |number|9  number >= minimum10end
  4. do |number|

    pass 1 of 4
    8selected = doubled.select do |number4|9  number >= minimum10end
    All 4 passes — pass 1 is the card above
    passnumberdoubledselected
    14
    28
    312
    416[4, 8, 12, 16][4, 8, 12, 16]
  5. puts "doubled=#{doubled.join(",")}"

    12puts "doubled=#{doubled.join(",")4,8,12,16}"13puts "minimum=#{minimum4}"14puts "selected=#{selected.join(",")4,8,12,16}"
    outputdoubled=4,8,12,16
    minimum=4
    selected=4,8,12,16
  1. numbers ← [2, 4, 6, 8], minimum ← 10

    1numbers→ [2, 4, 6, 8] = [2, 4, 6, 8]2minimum→ 10 = 1034doubled = numbers[2, 4, 6, 8].map do |number|5  number * 26end
  2. do |number|

    pass 1 of 4
    4doubled = numbers.map do |number2|5  number * 26end
    All 4 passes — pass 1 is the card above
    passnumbernumbersdoubled
    12
    24
    36
    48[2, 4, 6, 8][4, 8, 12, 16]
  3. selected = doubled.select do |number|

    8selected = doubled[4, 8, 12, 16].select do |number|9  number >= minimum10end
  4. do |number|

    pass 1 of 4
    8selected = doubled.select do |number4|9  number >= minimum10end
    All 4 passes — pass 1 is the card above
    passnumberdoubledselected
    14
    28
    312
    416[4, 8, 12, 16][12, 16]
  5. puts "doubled=#{doubled.join(",")}"

    12puts "doubled=#{doubled.join(",")4,8,12,16}"13puts "minimum=#{minimum10}"14puts "selected=#{selected.join(",")12,16}"
    outputdoubled=4,8,12,16
    minimum=10
    selected=12,16

Map, Then Select

  1. Start with numbers: [2, 4, 6, 8].
  2. map doubles each number into a new array.
  3. select checks each doubled number.
  4. Only values at least minimum stay in selected. | Original | After map | >= minimum when minimum is 6 | | --- | --- | --- | | 2 | 4 | drop | | 4 | 8 | keep | | 6 | 12 | keep | | 8 | 16 | keep |

Exercise: enumerable_map_select.rb

Double each number with map, then use select to keep values at or above a minimum