Вызывает блок один раз для каждого элемента массива, передавая этот элемент в качестве параметра - PullRequest
2 голосов
/ 13 марта 2010

У меня есть некоторые трудности с использованием блока Ruby, передавая метод.

Как и в следующем случае, я хотел бы отобразить каждый элемент @array из экземпляра Box (используя метод .each):

class Box
  def initialize
    @array = [:foo, :bar]
  end

  def each(&block)
    # well, hm..
  end
end

a = Box.new
a.each { |element| puts element }

Ответы [ 2 ]

6 голосов
/ 13 марта 2010

Вам просто нужно делегировать каждому методу @array и передать ему блок. Кроме того, вы можете включить дополнение Enumerable, чтобы получить доступ к предоставляемым им методам (например, map, inject и т. Д.):

class Box
  include Enumerable

  def initialize
    @array = [:foo, :bar]
  end

  def each(&block)
    @array.each(&block)
  end
end

Более подробная информация о модуле Enumerable доступна в документации .

1 голос
/ 13 марта 2010

В этом простом примере вам фактически не требуется явно передавать блок:

def each                  
  @array.each{|e| yield e}
end

Передача блока (который является объектом Proc ) явно позволяет вам проверить его на такие вещи, как количество ожидаемых аргументов:

class Box
  ...    
  def each(&block)
    @array.each do |e|
      case block.arity
      when 0
        yield
      when 1
        yield e
      when 2
        yield e, :baz
      else
        yield
      end
    end
  end
end

a = Box.new
a.each { puts "nothing" }              # displays "nothing, nothing"
a.each { |e| puts e }                  # displays "foo, bar"
a.each { |e1, e2| puts "#{e1} #{e2}" } # displays "foo baz, bar baz" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...