Ruby的具体惯用法在下面的连接里:
[url]http://www.javaeye.com/post/140685[/url]
文中说inject方法难以理解,也许作者考虑的层次不一样,也许作者是拿自己脑子里存在的别的语言所比较的结果,是难以理解。为什么要和别的语言来比呢?
inject方法难以理解吗?
第一种形式:
一般写法:
代码
result = []
(1..10).each{|item| result << item}
例子:
[1,2,3].inject([]) do |a, item|
p a
a << item
end
此时输出:
[]
[1]
[1,2]
=> [1,2,3]
习惯写法:
代码
(1..10).inject([]){|array, item| array << item}
第二种形式:
代码
(1..10).inject{|sum, item| sum += item}
这个等于
(1..10).inject(0){|sum, item| sum += item}
第一种形式允许你为array提供一个初始值,第二种形式使用管道里第一个参数做初始值,在迭代的时候跳过该元素,怎么理解呢?
例如:
(1...2).inject do |sum,item|
p sum
sum << item
end
irb中输出:1
但是:
(1..2).inject do |sum,item|
p sum
sum << item
end
irb中输出 1,4
sum=1不参与迭代,只是初始值,当迭代发生的时候,第二轮循环开始,item从2开始迭代。。。
sum << item 此时为: 1 << 2
1左移了两位就变成了4
实际中的使用:
比如算总价格:
@items.inject(0) {|sum,item| sum+item.price}
注意的一个问题:
Ruby中的 << ,当用于数组的时候,代表添加,arr << obj,把obj添加到arr数组的末尾,返回数组本身。但是当是数字的时候,则是左移,左移n位,则最后结果是,sum * (2n次方)
©著作权归作者所有:来自51CTO博客作者blackanger的原创作品,如需转载,请注明出处,否则将追究法律责任
职场休闲ROR
0
共同学习,写下你的评论
评论加载中...
作者其他优质文章