31 Stimmen

Ruby-Methoden, die entweder einen Enumerator liefern oder zurückgeben

In neueren Versionen von Ruby sind viele Methoden in Enumerable ein zurückgeben Enumerator wenn sie ohne einen Block aufgerufen werden:

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

Ich möchte das Gleiche mit meinen eigenen Methoden tun, und zwar so:

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 }

34voto

tokland Punkte 63238

Die Kernbibliotheken fügen einen Guard ein return to_enum(:name_of_this_method, arg1, arg2, ..., argn) unless block_given? . In Ihrem Fall:

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]

11voto

levinalex Punkte 5671

Utilice Zähler#neu :

class Array
  def double(&block)
    Enumerator.new do |y| 
      each do |x| 
        y.yield x*2 
      end 
    end.each(&block)
  end
end

2voto

mwolfetech Punkte 1446

Ein anderer Ansatz könnte sein:

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

0voto

DDD Punkte 421

Der einfachste Weg für mich

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X