• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Ruby中的inject

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

刚接触inject时,对其了解不是很深,直看到这篇文章 ruby-inject,才有了新的认识,文章配合大量例子进行说明。 
1、先看最简单的求和例子,我们从这里分析inject的实现机制。 

Ruby代码  
  1. [1, 2, 3, 4].inject(0) { |result, element| result + element } # => 10  


    inject带有一个参数和block。block中的两个参数是有含义的。第一个参数reslut在inject第一次执行block时把inject带的参数付值给它,element就是数组中的元素,该例中inject一共执行4次block,每次执行block完后,最后语句的结果再付值给result,如此循环,直到遍历数组中所有元素。我们深入这个例子看每一步执行的结果。 
因为数组有4个元素,所以要执行4次block操作: 
  第一次操作:result=0,既等于inject带的参数;element=1,既第一个元素;执行block后result + element =1,再把这个结果付值给result,所以在执行完第一次block后,result = 1。 
  第二次操作:result=1,既上次运行block后的最后一条语句的结果;element=2,既第二个元素;执行block后付值result=3。 
如此类推,直到最后一次执行完block,生产的值为10。就是inject的返回值了。 

    inject可以不带参数,此时result的初始值为数组元素的第一个值。所以上例可改写成: 

Ruby代码  
  1. [1, 2, 3, 4].inject{ |result, element| result + element }  


这时执行block的次数为3次。 

    文章中还提到也其它用法: 

Ruby代码  
  1. hash = [[:first_name'Shane'], [:last_name'Harvie']].inject({}) do |result, element|  
  2.   result[element.first] = element.last  
  3.   result  
  4. end  
  5.   
  6. hash # => {:first_name=>"Shane", :last_name=>"Harvie"}  


把array转换成hash表。有也第一个例子的基础,这个例子应该很容易看得懂。 

    再看一个例子,需要对一数组元素进行过滤并进行一些加工, 

Ruby代码 
  1. [1, 2, 3, 4, 5, 6].select { |element| element % 2 == 0 }.collect { |element| element.to_s } # => ["2", "4", "6"]  


上面代码实现选取数组中的偶数,并把它们转换成字符型。用inject如何实现呢? 

Ruby代码  
  1. array = [1, 2, 3, 4, 5, 6].inject([]) do |result, element|  
  2.   result << element.to_s if element % 2 == 0  
  3.   result  
  4. end  
  5.   
  6. array # => ["2", "4", "6"]  


是不是更直观? 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
一步一步学Ruby(十一):控制语句发布时间:2022-07-14
下一篇:
Ruby入门(2)——基本流程控制发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap