我正在阅读Programming Ruby 1.9 (3rd edition): The Pragmatic Programmers' Guide,并对其中一个代码示例提出疑问。
在页面101上,有这个例子:
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(:+) # => "euiooue"
在each
方法中,scan
的每个匹配结果都会传递到调用yield
的块。但究竟是yield vowel
行在做什么?根据我的理解,yield
用于从方法中调用块(传递给方法)。在这种情况下它在做什么?
答案 0 :(得分:1)
正如你所理解的那样,它正在调用传递给方法的块。
答案 1 :(得分:0)
值得注意的是,这是Enumerable
混合+ each
(必须产生所需元素)的经典用法。你只需要实现each
,你就可以得到所有很酷的方法(在你的例子中,inject
)。参见:
http://www.ruby-doc.org/core/classes/Enumerable.html
“Enumerable mixin为集合类提供了多种遍历和搜索方法,并具有排序功能。该类必须提供一个方法,每个方法都会产生集合的连续成员。”