这两个Ruby枚举器之间的差异:[1,2,3] .map与[1,2,3] .group_by

时间:2014-05-24 06:39:20

标签: ruby enumerable enumerator

在Ruby中,这两个枚举器之间是否存在功能差异?

irb> enum_map = [1,2,3].map
=> #<Enumerator: [1, 2, 3]:map> # ends with "map>"

irb> enum_group_by = [1,2,3].group_by
=> #<Enumerator: [1, 2, 3]:group_by> # ends with "group_by>"

irb> enum_map.methods == enum_group_by.methods
=> true # they have the same methods

#<Enumerator: [1, 2, 3]:map>可以<Enumerator: [1, 2, 3]:group_by>做什么,反之亦然?

谢谢!

2 个答案:

答案 0 :(得分:3)

来自group_by的文档:

  

按块的结果对集合进行分组。返回一个哈希值   keys是块的评估结果,值是数组   集合中与密钥对应的元素。

     

如果没有给出阻止,则返回枚举数。

(1..6).group_by { |i| i%3 }   #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}

来自map的文档:

  

返回一个新数组,其中包含每次运行块一次的结果   枚举中的元素。

     

如果没有给出阻止,则返回枚举器。

(1..4).map { |i| i*i }      #=> [1, 4, 9, 16]
(1..4).collect { "cat"  }   #=> ["cat", "cat", "cat", "cat"]

正如您所看到的,每个人都做了不同的事情,这有不同的目的。得出结论,两个API是相同的,因为它们暴露相同的接口似乎错过了面向对象编程的全部目的 - 不同的服务假设暴露相同的接口以启用polymorphism

答案 1 :(得分:2)

他们所做的事情有所不同,但从根本上说,他们都属于同一类:Enumerator

当它们被使用时,枚举器发出的值会有所不同,但它们的接口是相同的。

同一类的两个对象通常具有相同的方法。可以使用其他方法扩充实例,但通常不会这样做。