文档章节

Ruby中的inject

daniel-john
 daniel-john
发布于 2015/02/25 10:08
字数 580
阅读 17
收藏 0
点赞 0
评论 0

Ruby中的inject                

    博客分类:
  • Ruby

 

Ruby中的inject
参考: ruby-inject

    刚接触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"]  


是不是更直观?


本文转载自:http://biyeah.iteye.com/blog/1286449

共有 人打赏支持
daniel-john
粉丝 17
博文 121
码字总数 56017
作品 0
其他
程序员
ruby中的inject

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

孔俊 ⋅ 2013/08/06 ⋅ 0

Ruby小笔记,持续补充

逻辑或运算符作用,判断空值的语法糖 a=nil a||=333 则 a=333 inject的语法糖 inject(initial, sym) → obj inject(sym) → obj inject(initial) {| memo, obj | block } → obj inject {| ......

Henry_Ma ⋅ 2011/05/31 ⋅ 0

这些魔幻的Ruby特性,了解一下?

内容主要来自于《七天七语言》和《Ruby Programming》。 一、Ruby核心思想 Bruce有一段非常精彩的话,来形容Ruby: Ruby是崇尚自由精神的语言,允许做几乎一切事情,包括修改NilClass或Strin...

大大枣 ⋅ 05/16 ⋅ 0

某个 Rails 5 项目走过的路 (续)

第一篇地址在这:https://ruby-china.org/topics/34061 我们接着记录开发应用中遇到的一些小问题。 在 sql 中拼接字符串形式的时间需要注意时区问题 我们经常会使用这样的查询: 如果你的应用...

pinewong ⋅ 2017/11/24 ⋅ 0

定义P(n)为正整数n的所有非0数字的乘积,计算P(1),P(2)...P(999)的和

例如:P(3) = 3, P(123) = 123 = 6, P(204) = 2*4 = 8计算:P(1)+P(2)+P(3)+...+P(999) Rust: Haskell Ruby 或者用 来替换 更加简洁 结果是97335,ruby和haskell解决数学问题很清晰。 julia语...

hell0cat ⋅ 2016/07/11 ⋅ 0

Ruby中的Proc/lambda

Ruby中的Proc,有两种,一种是 Proc 一种是 Lambda,可以通过 lambda? 来检测是否为lambda。其实lambda就是proc的另外一种形态: > ->{} # 创建一个lambda => #Proc:0x007fc3fb809e60@(irb):...

hell0cat ⋅ 2015/12/07 ⋅ 0

要求把一个字符串中1存在的位置区间表现出来

原文地址:http://www.cnblogs.com/JeffreyZhao/archive/2009/04/19/why-i-do-not-like-java.html 用Haskell实现一下: 实现的比较原始,所以比较啰嗦,基本原理是用foldl,传入一个元组,第...

hell0cat ⋅ 2016/07/15 ⋅ 0

基于gollum的wiki搭建

基于gollum的wiki搭建 gollum是个啥 gollum是一个基于git的,解析markdown文件的wiki系统;gollum项目托管在github上:gollum (https://github.com/gollum/gollum),项目的wiki地址:https...

alex ⋅ 2016/07/12 ⋅ 0

Ruby中的each collect map inject

说明: each——连续访问集合的所有元素 collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。 map——-同collect。 inject——遍历集合中的各个元素,将各个元素累积...

孔俊 ⋅ 2013/08/02 ⋅ 0

Istio: Traffic Management for your Microservices

Istio: Traffic Management for your Microservices Read this in other languages: 한국어. Microservices and containers changed application design and deployment patterns, but alon......

IBM ⋅ 2017/12/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 33分钟前 ⋅ 0

vim使用手册--配对括号的查找

1、把光标放在标记有(、[或{处。 2、按%字符 3、此时光标的位置应当在配对的括号处 4、再次按%就可以跳回配对的第一个括号处。

dragon_tech ⋅ 37分钟前 ⋅ 0

c++ 、object-c printf,%02X和%x有什么区别 ?

%x即按十六进制输出,英文字母小写,右对齐。 %02X有以下变化:英文字母变大写,如果输出字符不足两位的,输出两位宽度,右对齐,空的一位补0。超过两位的,全部输出。 如果不用 %02x 会出现...

yizhichao ⋅ 42分钟前 ⋅ 0

Spring源码解析(七)——实例创建(中)

前言 上一节讲到了,Spring 会根据实例的作用域执行不同的创建逻辑,分别是 Singleton、Prototype、其他 Scope,其中 Singleton 会调用 getSingleton 从缓存中获取,缓存中没有才会创建实例;...

MarvelCode ⋅ 42分钟前 ⋅ 0

Thrift RPC实战(六) spring集成thrift

1.服务端设置 对泛型Thrift Service的支持, 通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下 <!...

lemonLove ⋅ 44分钟前 ⋅ 0

oracle11g自动分区使用

为什么使用自动分区? 在oracle11g之前,oracle是不支持自动分区功能的,这就可能导致我们系统在运行一段时间之后,就需要看看分区是否创建或者写触发器进行创建分区,否则就会导致数据无法入...

strict_nerd ⋅ 56分钟前 ⋅ 0

Spring mvc ViewResolver视图解析器实现机制

概要 我们在controller里面经常这样return一个ModelAndView。 return new ModelAndView("userList", "users", userList); DispatcherServlet 靠 ViewResolver 把 userList 解析为 /WEB-INF......

轨迹_ ⋅ 今天 ⋅ 0

策略模式

1.策略模式 策略模式是同一个行为的不同处理办法。策略模式和简单工厂模式的区别:1.策略模式主要是方法的执行方式,工厂模式要获取的对象。两者的侧重点不同。 ...

Cobbage ⋅ 今天 ⋅ 0

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 今天 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部