Ruby:map和inject之间的区别

时间:2014-01-21 14:44:34

标签: ruby

在这里阅读有关SO的各种解释,它们已被描述为:


地图:

  

map方法采用可枚举对象和块,并为每个元素运行块


进样:

  

Inject接受一个值和一个块,它为列表的每个元素运行该块一次。

希望你理解为什么我觉得它们在表面上看起来非常相似。我何时会选择其中一个,它们之间是否存在明显差异?

3 个答案:

答案 0 :(得分:12)

如果您认为inject的别名为reduce,则会有所帮助。 map用于转换列表,例如将数组中的所有字符串转换为大写,而inject接受一个参数(通常是累加器)并修改它。

示例:

 %w(a b c).map(&:upcase) #=> ["A", "B", "C"]
 [*1..4].inject(:+) #=> 10

如果您想了解更多内容,inject所做的事情被称为fold

答案 1 :(得分:4)

inject将一个对象作为其参数,并执行一些操作并返回该修改后的对象。

arr = []
[1,2].inject(arr) { |s,e| s << e }
arr # => [1,2]

在上面的例子中,看到我传递了一个空数组arr,但在调用#inject之后,我在块内执行了concatenation操作,并执行了arr。之后我打印了它,我可以看到arr现在保存的条目为1,2

map创建一个新的Enumerable对象,该对象是根据您调用它的接收方Enumerable对象创建的。它将接收来自接收器的每个元素,并将执行一些操作并将放入新的Enumerable元素,然后是next和next等等。

arr = [1,2]
arr.map { |e| e + 1 } # => [2,3]
arr # => [1,2]

使用#map,block将获取每个参数并将其递增1,并且递增的值将相同的索引放在新数组中,其中索引采用原始元素。但是最后一个数组是一个新数组,它与arr没有任何关系。当我p arr时,我在启动arr操作之前的#map中获得了相同的内容。

答案 2 :(得分:3)

使用inject,您通常会返回一个值(通常用于数学),而使用map时,您将返回一个数组。