在为mixin Enumerable定义的每个方法中使用哪个块产生调用?

时间:2015-10-12 09:17:56

标签: ruby block yield inject

class VowelFinder 
  include Enumerable

  def initialize(string) 
    @string = string
  end

  def each
    @string.scan(/[aeiou]/) do |vowel| 
      yield vowel
    end 
  end
end

vf = VowelFinder.new("the quick brown fox jumped") 
vf.inject(:+)

上面的代码扫描字符串中的元音,并使用inject将它们放在一个字符串中。

我无法理解的是每个方法中的块产量调用。据我所知,屈服需要一个工作块,我无法在任何地方看到。

1 个答案:

答案 0 :(得分:1)

ruby​​ doc告诉你它是如何工作的

  

可枚举

     

Enumerable mixin为集合类提供了多种遍历和搜索方法,并具有排序功能。该类必须提供每个方法,它产生集合的连续成员。如果使用Enumerable#max,#min或#sort,则集合中的对象还必须实现有意义的< =>运算符,因为这些方法依赖于集合成员之间的排序。

由于您的班级VowelFinder包含Enumerable,您必须使用each来实施yield,而Enumerable#inject实施的其余部分将使inject(:+)成为Enumerable {1}}工作。

该块是inject的实现细节,因此无法直接访问,但由www.domain.com/pools/show/12调用创建。