在这里阅读有关SO的各种解释,它们已被描述为:
的地图:
map方法采用可枚举对象和块,并为每个元素运行块
的进样:
Inject接受一个值和一个块,它为列表的每个元素运行该块一次。
希望你理解为什么我觉得它们在表面上看起来非常相似。我何时会选择其中一个,它们之间是否存在明显差异?
答案 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时,您将返回一个数组。