Containers, Blocks, and Iterators(Chapter 4 of Programming Ruby)
1 def three_times
2 yield
3 yield
4 yield
5 end
6 three_times { puts "Hello" }
2 yield
3 yield
4 yield
5 end
6 three_times { puts "Hello" }
inject
1 [1,3,5,7].inject(0) {|sum, element| sum+element} # => 16
2 [1,3,5,7].inject(1) {|product, element| product*element} # => 105
3
4 [1,3,5,7].inject {|sum, element| sum+element} # => 16
5 [1,3,5,7].inject {|product, element| product*element} # => 105
2 [1,3,5,7].inject(1) {|product, element| product*element} # => 105
3
4 [1,3,5,7].inject {|sum, element| sum+element} # => 16
5 [1,3,5,7].inject {|product, element| product*element} # => 105
yielder
1 triangular_numbers = Enumerator.new do |yielder|
2 number = 0
3 count = 1
4 loop do
5 number += count
6 count += 1
7 yielder.yield number
8 end
9 end
10
11 5.times { puts triangular_numbers.next }
12 1
13 3
14 6
15 10
16 15
2 number = 0
3 count = 1
4 loop do
5 number += count
6 count += 1
7 yielder.yield number
8 end
9 end
10
11 5.times { puts triangular_numbers.next }
12 1
13 3
14 6
15 10
16 15
1 def n_times(thing)
2 lambda {|n| thing * n }
3 end
4
5 p1 = n_times(23)
6 p1.call(3) # => 69
7 p1.call(4) # => 92
8 p2 = n_times("Hello ")
9 p2.call(3) # => "Hello Hello Hello "
2 lambda {|n| thing * n }
3 end
4
5 p1 = n_times(23)
6 p1.call(3) # => 69
7 p1.call(4) # => 92
8 p2 = n_times("Hello ")
9 p2.call(3) # => "Hello Hello Hello "