在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"]
按预期工作。
但是如果我使用Enumerable覆盖现有类的each
方法,它就不会破坏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]
[1]:来自http://www.sitepoint.com/guide-ruby-collections-iii-enumerable-enumerator/
答案 0 :(得分:7)
Enumerable
map
的实现确实使用了each
,但没有什么可以阻止扩展类使用自己的实现来覆盖它而不使用each
Array
。
在这种情况下,出于效率原因,map
确实提供了自己的{{1}}实现。