`
biyeah
  • 浏览: 201406 次
  • 来自: ...
社区版块
存档分类
最新评论

Ruby中的inject

    博客分类:
  • Ruby
 
阅读更多
Ruby中的inject
参考: ruby-inject

    刚接触inject时,对其了解不是很深,直看到这篇文章 ruby-inject,才有了新的认识,文章配合大量例子进行说明。
1、先看最简单的求和例子,我们从这里分析inject的实现机制。
[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的初始值为数组元素的第一个值。所以上例可改写成:
[1, 2, 3, 4].inject{ |result, element| result + element }

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

    文章中还提到也其它用法:
hash = [[:first_name, 'Shane'], [:last_name, 'Harvie']].inject({}) do |result, element|
  result[element.first] = element.last
  result
end

hash # => {:first_name=>"Shane", :last_name=>"Harvie"}

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

    再看一个例子,需要对一数组元素进行过滤并进行一些加工,
[1, 2, 3, 4, 5, 6].select { |element| element % 2 == 0 }.collect { |element| element.to_s } # => ["2", "4", "6"]

上面代码实现选取数组中的偶数,并把它们转换成字符型。用inject如何实现呢?
array = [1, 2, 3, 4, 5, 6].inject([]) do |result, element|
  result << element.to_s if element % 2 == 0
  result
end

array # => ["2", "4", "6"]

是不是更直观?

    文章后面还提到复杂的应用,有些还看不明,以后看明也再补充吧,有兴趣的读者可以直接看原文。
分享到:
评论

相关推荐

    Ruby Data-Processing ruby数据处理

    2. **Ruby Reduce**: Reduce(也称为fold或inject)函数用于对数组的所有元素进行累积操作,通常用于聚合操作,如求和、乘积或计算平均值。例如,计算数组元素的总和: ```ruby numbers = [1, 2, 3, 4, 5] sum =...

    ruby实用函数和实例

    在Ruby中,有许多实用的内置函数和方法,这些工具极大地提升了开发者的效率。在这个主题下,我们将深入探讨Ruby的一些关键函数和实例,以及如何在实际编程中应用它们。 首先,我们关注的是"使用Ruby语言实现自动...

    Ruby-ParallelRuby让并行处理简单和快速

    除了`each`方法,Parallel库还提供了其他方法,如`map`、`inject`等,这些都是并行版本的内置Ruby方法,方便在并行环境下使用熟悉的编程模式。 在实际应用中,理解并行处理的潜在问题也至关重要,如数据竞争、死锁...

    Ruby-fastrubyRuby编写快速收集常见Ruby惯用语

    `fast-ruby` 比较了`map`、`each_with_object` 和`inject` 等方法,解释了何时选择哪种方式会更高效。 4. **条件语句与逻辑运算符** `if` 和 `unless` 语句在Ruby中广泛使用,但它们的替代品,如三元运算符和逻辑...

    gr8:将Ruby功能(map,select,inject,grep等)带到您的命令行

    使用Gr8,您可以在命令行中使用map,select,inject,grep,max,min,...。安装$ gem install gr8或者: $ curl -o gr8 http://j.mp/Gr8_rb$ chmod a+x gr8$ sudo mv gr8 /usr/local/binGr8需要Ruby(&gt; = 2.0)。...

    深入理解Ruby中的block概念

    在Ruby的Enumerable模块中,许多方法如`map`、`reduce`(也称为`inject`)、`filter`(也称为`select`)等,都依赖于block来执行操作。虽然JavaScript也有类似的函数实现,如Prototype.js中的Enumerable,但它们是...

    inject-rewrite_Week-2

    在这个“inject-rewrite_Week-2”项目中,我们将学习如何在不丧失原有功能的前提下,对Ruby的`inject`方法进行重写。 【描述】:“我的注入方法 [创客学院] 第二周挑战赛” 这是一项来自“创客学院”的编程挑战,...

    举例讲解Ruby中迭代器Iterator的用法

    在Ruby编程语言中,迭代器(Iterator)是一个至关重要的概念,它允许我们遍历数据结构或执行一系列操作,而无需显式地暴露其内部结构。迭代器方法通常会调用一个代码块(Block),这个代码块可以在方法执行过程中被...

    inject-some-sql:将SQL注入Ruby on Rails应用程序中很有趣!

    cd inject-some-sql/rails5在子目录中,安装依赖项并设置数据库: bundle installrake db:setup db:seed跑典型的Rails开始: rails s在浏览器中打开 。重置数据库使用SQL注入很容易使数据库混乱。 服务器确实会在...

    zipf_distribution:Ruby 中的齐夫定律

    在Ruby编程语言中,我们可以利用这个概念来分析文本数据,理解语言模式,或者优化数据结构和算法设计。 Ruby是一种动态类型的、面向对象的脚本语言,以其简洁的语法和强大的功能而受到开发者喜爱。在Ruby中实现齐夫...

    inject-rewrite:创客学院

    将解决方案推送到名为“inject-rewrite”的 Github 存储库###执行第一项工作是重新阅读并完全理解 Ruby 中的注入(AKA reduce )方法,我认为它与此定义接近: 本机方法作用于可枚举对象,并接受一个参数和一个...

    ruby-algorithmic-strategies

    Ruby社区提供了许多算法库,如`enumerable-extras`扩展了Enumerable模块,`traversal`库用于树和图的遍历,`backports`库提供了一些旧版本Ruby中缺失的算法。 五、实战演练 "ruby-algorithmic-strategies-main"这个...

    custom_ruby_enumerables:此应用程序是使用用户自定义代码实现内置Ruby枚举器的演示。

    Ruby自定义可枚举方法内容| | | |关于该项目是一个微型宇宙合作项目,是Ruby部分中微型宇宙技术课程要求的一部分。 该项目由不同的ruby可枚举方法组成,这些方法可模仿Ruby的内置可枚举方法方法下面列出了创建的...

    Inject:挑战#4 Makers Academy

    重写注入方法概要重写 Array 类的注入方法使用的技术RubyRSPEC... 我发现自己试图在各种情况下使用 .inject,即使是那些绝对适用的情况。 我敢肯定,这是几天内使用一种方法如此紧密而强烈地工作的可预测和暂时的效果。

    Ruby基础知识之基本流程控制

    在Ruby中,基本流程控制主要包括条件判断、循环语句以及迭代器和枚举。接下来,我们将深入探讨这三个主题。 (一)条件判断 Ruby中的条件判断主要有if、else、elsif和unless四种形式。if表达式后跟一个条件,如果...

    ruyb1.9.3标准库帮组文档

    2. **Enumerable模块**:Ruby的Enumerable模块提供了一组方便的数据处理方法,如`each`, `map`, `select`, `inject`等,可以遍历并操作数组、哈希等可枚举对象。 3. **String类**:Ruby的字符串处理非常强大,...

    interrotron:在Ruby中用于安全规则评估的(不完整)lisp

    旋流器 一个简单的非图灵完整lisp,意在作为规则引擎嵌入到应用程序中。 它的设计旨在限制受评估代码的危害(与纯Ruby“ eval”相反),并且被限制为: 默认情况下完全沙箱化总是完成执行(没有无限循环) 让您轻松...

    practice_ruby

    函数式编程也是Ruby的一个重要方面,它提供了高阶函数如`map`、`reduce`(也称为`inject`)和`select`。这些函数允许对集合进行操作,而无需显式地使用循环。 Ruby标准库非常丰富,包含许多内置模块和类,比如`File...

    L-99-Ninety-Nine-Lisp-Problems-Solutions-Ruby:解决方案 rb

    4. **迭代和集合操作**:学习如何高效地使用 Ruby 的集合操作,如 map、reduce、filter 和 inject 等。 5. **问题解决策略**:通过解决具体问题,提升分析问题和设计解决方案的能力。 6. **代码组织和测试**:了解...

    automatic_software_repair_eci:Ruby 自动软件修复工具原型

    举个例子:对于迭代上使用一个收集元件each在Ruby(或do:在Smalltalk中),而不是for环路,用于从使用一个列表的过滤元件select或reject使用谓词作为参数,用于计算经常使用集合的每个元素的累积结果inject (或...

Global site tag (gtag.js) - Google Analytics