`map`是否使用`each`或不使用?

时间:2014-08-24 21:36:22

标签: ruby enumerable

在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/

1 个答案:

答案 0 :(得分:7)

<Enumerable map的实现确实使用了each,但没有什么可以阻止扩展类使用自己的实现来覆盖它而不使用each Array

在这种情况下,出于效率原因,map确实提供了自己的{{1}}实现。