Ruby的inject方法讲解

本文介绍了 Ruby 中 inject 方法的使用技巧及注意事项,通过示例对比展示了如何利用该方法简化数组操作,并解析了常见错误及其解决方案。

Ruby的inject方法,一开始不好扭转思维。

 

inject是我最喜欢用的方法,因为它可以使如下的代码变的更漂亮:

arr1 = []
arr2 = [1,2,3]
arr2.each  do |i|
   arr1 << i + 1
end
p arr1
#=> [2, 3, 4]

使用inject:

arr = arr2.inject([])  do|arr1, i|
           arr1 << i + 1
        end
p arr
#=>[2,3,4]



但是,如果这么写:

arr = arr2.inject([])  do |arr1,i|
            arr1 << i+1   if i%2 == 0
          end

就会报错:   undefined method `<<' for nil:NilClass
这是值得注意的地方,起码是我常犯错的一个地方。
inject([]) do |item ,i |这样的写法,每一步,item都会被设置为block的返回值。上面的例子里,第一步if语句显然返回了nil,所以当执行第二步迭代的时候,自然给nil对象调用了<< 这个方法,就报错了!
这个问题怎么解决 ?
当然在判断条件为false的情况下返回当前的这个item值就ok了,像下面这样:

arr = arr2.inject([])  do |arr1,i|
            (i%2) == 0 ? (arr1 << i+1) : arr1
         end

 

 


完了来回顾一下inject方法两种用法:

enum.inject(init_value) {|memo,obj|  block}
enum.inject{ |memo,obj| block }

第一种,memo以init_value为初始值
第二种,memo以 enum里的第一个元素为初始值。
--这里memo是memory的意思,起到了缓存的作用。最终返回这个值。

 

 

from:http://blackanger.blog.51cto.com/140924/90539

 

 

 

T

T

T

8

T

T

T


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值