30

Rubyの最近のバージョンでは、多くのメソッドがブロックなしで呼び出されたときにEnumerable返されます。Enumerator

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

私は次のような自分の方法で同じことをしたいです:

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 }
4

4 に答える 4

10

Enumerator#newを使用します。

class Array
  def double(&block)
    Enumerator.new do |y| 
      each do |x| 
        y.yield x*2 
      end 
    end.each(&block)
  end
end
于 2012-02-09T15:19:59.087 に答える
2

別のアプローチは次のとおりです。

class Array
    def double(&block)
        map {|y| y*2 }.each(&block)
    end
 end
于 2011-08-25T02:01:04.863 に答える