对数组的每个元素调用一次,将该元素作为参数传递

时间:2010-03-13 11:33:40

标签: ruby methods

使用Ruby块时遇到一些困难,传入一个方法。

在下面的例子中,我想从Box实例中显示@array的每个元素(使用.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 个答案:

答案 0 :(得分:6)

你真的只需要委托@array上的每个方法并将其传递给块。此外,您可以包含Enumerable mix-in以访问它提供的方法(例如map,inject等等):

class Box
  include Enumerable

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

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

有关“可枚举”模块的更多信息,请in the documentation

答案 1 :(得分:1)

对于这个简单的例子,实际上你不需要明确地传递块:

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

明确地传递块(Proc object)允许您测试它的内容,例如它所期望的参数数量:

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"