收藏 | Ruby惯用法

Ruby的具体惯用法在下面的连接里:
[url]http://www.javaeye.com/post/140685[/url]
文中说inject方法难以理解,也许作者考虑的层次不一样,也许作者是拿自己脑子里存在的别的语言所比较的结果,是难以理解。为什么要和别的语言来比呢?

inject方法难以理解吗?
第一种形式:
一般写法:
代码
  1. result = []  
  2. (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. (1..10).inject([]){|array, item| array << item} 
第二种形式:
代码
  1. (1..10).inject{|sum, item| sum += item}  
  2. 这个等于  
  3. (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次方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值