在Ruby中,Enumerable模块混合到集合类中,并依赖于提供each方法的类,该方法生成集合中的每个项目.
好的,所以如果我想在我自己的类中使用Enumerable,我将只实现each[1]:
class Colors
include Enumerable
def each
yield "red"
yield "green"
yield "blue"
end
end
> c = Colors.new
> c.map { |i| i.reverse }
#=> ["der", "neerg", "eulb"]
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
但是如果我each用Enumerable 覆盖现有类的方法,它不会破坏像map.为什么不?
class Array
def each
puts "Nothing here"
end
end
> [1,2,3].each {|num| puts num }
#=> "Nothing here"
> [1,2,3].map {|num| num**2 }
#=> [1,4,9]
Run Code Online (Sandbox Code Playgroud)
[1]:来自http://www.sitepoint.com/guide-ruby-collections-iii-enumerable-enumerator/
Enumerablemap确实使用的实现each,但没有什么能阻止扩展类使用自己的实现来覆盖它而不使用它each.
在这种情况下Array,map出于效率原因确实提供了自己的实现.