Ruby迭代器each、map、collect、inject
说明:
each——连续访问集合的所有元素
collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。
map——-同collect。
inject——遍历集合中的各个元素,将各个元素累积成返回一个值。
例子:
defdebug(arr)
puts'--------'
putsarr
end
h=[1,2,3,4,5]
h1=h
h1.each{|v|putssprintf('valuesis:%s',v)}
h2=h.collect{|x|[x,x*2]}
debugh2
h3=h.map{|x|x*3}
debugh3
h4=h.inject{|sum,item|sum+item}
#inject()函数如果没有带参数而是直接带的block的话,那么将会把数组的第一个元素复制给sum,数组的第二个值复制给item,每次inject运算完成后将运算结果都保存给sum,item表示数组中的每个元素
#如果inject()函数传递了参数,那么这个参数将会复制给sum,item从元素的第一个值开始,并将每次inject运算后的值赋值给sum
debugh4
结果:
valuesis:1
valuesis:2
valuesis:3
valuesis:4
valuesis:5
--------
1
2
2
4
3
6
4
8
5
10
--------
3
6
9
12
15
--------
15
names=%w[rubyrailsjavapythoncookoofirebody]
等同于:
names=["ruby","rails","java","python","cookoo","firebody"]
arr=[1,2,3]
1)arr2=arr.each{|element|element=element*2}#arr与arr2仍然都等于[1,2,3]each返回原数组遍历内对元素的更改不会保存
2)arr2=arr.map{|element|element=element*2}#arr等于[1,2,3]arr2等于[2,4,6]map返回更改后的数组遍历内对元素的更改不会保存
3)arr2=arr.map!{|element|element=element*2}#arr与arr2都等于[2,4,6]map!返回更改后的数组遍历对元素内的更改会保存
collect效果等于map
collect!效果等于map!