ruby enumerable

ruby - Métodos de rubí que producen o devuelven enumerador.



enumerable (4)

en versiones recientes de Ruby, muchos métodos en Enumerable devuelven un Enumerator cuando son llamados sin un bloque:

[1,2,3,4].map #=> #<Enumerator: [1, 2, 3, 4]:map> [1,2,3,4].map { |x| x*2 } #=> [2, 4, 6, 8]

Quiero hacer lo mismo en mis propios métodos así:

class Array def double(&block) # ??? end end arr = [1,2,3,4] puts "with block: yielding directly" arr.double { |x| p x } puts "without block: returning Enumerator" enum = arr.double enum.each { |x| p x }


Las bibliotecas principales insertan un return to_enum(:name_of_this_method, arg1, arg2, ..., argn) unless block_given? guarda return to_enum(:name_of_this_method, arg1, arg2, ..., argn) unless block_given? . En tu caso:

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]


Otro enfoque podría ser:

class Array def double(&block) map {|y| y*2 }.each(&block) end end


la manera más fácil para mí

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


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