Collections
Enumerable Map Select
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
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(",")}"
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 * 26enddo |number|
pass 1 of 44doubled = numbers.map do |number2|5 number * 26endAll 4 passes — pass 1 is the card above pass numbernumbersdoubled1 2 — — 2 4 — — 3 6 — — 4 8 [2, 4, 6, 8] [4, 8, 12, 16] selected = doubled.select do |number|
8selected = doubled[4, 8, 12, 16].select do |number|9 number >= minimum10enddo |number|
pass 1 of 48selected = doubled.select do |number4|9 number >= minimum10endAll 4 passes — pass 1 is the card above pass numberdoubledselected1 4 — — 2 8 — — 3 12 — — 4 16 [4, 8, 12, 16] [8, 12, 16] 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
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 * 26enddo |number|
pass 1 of 44doubled = numbers.map do |number2|5 number * 26endAll 4 passes — pass 1 is the card above pass numbernumbersdoubled1 2 — — 2 4 — — 3 6 — — 4 8 [2, 4, 6, 8] [4, 8, 12, 16] selected = doubled.select do |number|
8selected = doubled[4, 8, 12, 16].select do |number|9 number >= minimum10enddo |number|
pass 1 of 48selected = doubled.select do |number4|9 number >= minimum10endAll 4 passes — pass 1 is the card above pass numberdoubledselected1 4 — — 2 8 — — 3 12 — — 4 16 [4, 8, 12, 16] [4, 8, 12, 16] 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
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 * 26enddo |number|
pass 1 of 44doubled = numbers.map do |number2|5 number * 26endAll 4 passes — pass 1 is the card above pass numbernumbersdoubled1 2 — — 2 4 — — 3 6 — — 4 8 [2, 4, 6, 8] [4, 8, 12, 16] selected = doubled.select do |number|
8selected = doubled[4, 8, 12, 16].select do |number|9 number >= minimum10enddo |number|
pass 1 of 48selected = doubled.select do |number4|9 number >= minimum10endAll 4 passes — pass 1 is the card above pass numberdoubledselected1 4 — — 2 8 — — 3 12 — — 4 16 [4, 8, 12, 16] [12, 16] 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
- Start with
numbers:[2, 4, 6, 8]. mapdoubles each number into a new array.selectchecks each doubled number.- Only values at least
minimumstay inselected. | Original | Aftermap|>= minimumwhen minimum is6| | --- | --- | --- | |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