ruby inject,循环计算优化_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > ruby inject,循环计算优化

ruby inject,循环计算优化

 2012/9/8 11:52:55  chen_miao  程序员俱乐部  我要评论(0)
  • 摘要:From:http://blog.jayfields.com/2008/03/ruby-inject.html实体分析Ruby代码[1,2,3,4].inject(0){|result,element|result+element}#=>10inject带有一个参数和block。block中的两个参数是有含义的。第一个参数reslut在inject第一次执行block时把inject带的参数赋值给它,element就是数组中的元素,该例中inject一共执行4次block
  • 标签:Ruby 优化

From:http://blog.jayfields.com/2008/03/ruby-inject.html

?

实体分析?

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"]??

?

发表评论
用户名: 匿名