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

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)

2 years ago

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

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

由于您的类 VowelFinder 包含 Enumerable ,您必须使用 yield 实现 each ,而 Enumerable#inject 实现的其余魔法将使 inject(:+) 工作 .

该块是 Enumerable 的实现细节,因此无法直接访问,但由 inject 调用创建 .