注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 《网络规划设计师教程》..
 帮助

Alex学Ruby[ inject需要注意的地方 ]


2008-08-01 01:28:32
 标签:Ruby 语法 Alex    [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://blackanger.blog.51cto.com/140924/90539
inject真tm的神奇。

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里的第一个元素为初始值。

本文出自 “{ :Alex Space => " Ruby Notes " }” 博客,请务必保留此出处http://blackanger.blog.51cto.com/140924/90539



上一篇 QuickTime Player解码器  下一篇 TDD vs BDD

类别:Ruby on Rails 技术圈()阅读() ┆ 评论()推送到技术圈返回首页  


    文章评论
 
2008-08-01 10:08:14
我刚用的时候也经常犯这样的错,不给返回值

2009-06-05 09:59:36
#!/usr/bin/ruby -w

require 'iconv'

#为字符串定义一个新的方法.
class String
def gb_to_utf8
  inject(0){|r,s| r = Iconv.conv("UTF-8//IGNORE","GB18030//IGNORE",s).to_s}
end
def utf8_to_gb
  inject(0){|r,s| r = Iconv.conv("GB18030//IGNORE","UTF-8//IGNORE",s).to_s}
end
end

a = "中国"
print a.utf8_to_gb

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: