each/collect/map/inject的一些异同

by 小赓赓。 at over 8 years ago, last updated at over 8 years ago
W

先看一下如下代码:

a = [1,2,3]

a1 = a.each{ |x| puts x}#=>1 2 3
puts a1#=>1 2 3
puts a#=>1 2 3

a2 = a.collect{ |x| [x,x*2]}
puts a2#=>1 2 2 4 3 6
puts a#=>1 2 3


a3 = a.map{ |x| x*3}
puts a3#=>3 6 9
puts a#=>1 2 3

a4 = a.inject{ |sum,item| sum+item}
puts a4#=>6

a5 = a.map!{ |x| x*3}
puts a5#=>3 6 9
puts a#=>3 6 9
each---连续访问数组或String中的所有元素。而且each返回原数组,遍历内对元素的更改不会保存:如上a1#=>1 2 3 a#=>1 2 3
collect---从数组或String中传递各个元素到block中,block返回的结果生成新的数组或String;而且返回更改后的数组,遍历后的数组对元素的更改不会改变:如puts a2#=>1 2 2 4 3 6 puts a#=>1 2 3
map---与collect相同
map!---与collect相同,但是map!返回更改的数组,而且遍历后的数组对元素的更改也会改变:如puts a5#=>3 6 9 puts a#=>3 6 9
inject---遍历数组或String中的各个元素,把各个元素积累返回一个值