in recent versions of Ruby, many methods in Enumerable
return an Enumerator
when they are called without a block:
[1,2,3,4].map
#=>
The core libraries insert a guard return to_enum(:name_of_this_method, arg1, arg2, ..., argn) unless block_given?
. In your case:
class Array
def double
return to_enum(:double) unless block_given?
each { |x| yield 2*x }
end
end
>> [1, 2, 3].double { |x| puts(x) }
2
4
6
>> ys = [1, 2, 3].double.select { |x| x > 3 }
#=> [4, 6]
use Enumerator#new:
class Array
def double(&block)
Enumerator.new do |y|
each do |x|
y.yield x*2
end
end.each(&block)
end
end
Another approach might be:
class Array
def double(&block)
map {|y| y*2 }.each(&block)
end
end
easiest way for me
class Array
def iter
@lam = lambda {|e| puts e*3}
each &@lam
end
end
array = [1,2,3,4,5,6,7]
array.iter
=> 3 6 9 12 15 18 21