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

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中广泛使用,但它们的替代品,如三元运算符和逻辑...

    ruby的惯用法的使用

    - **注入操作**: Ruby中的`inject`方法类似于Python中的`reduce`函数。 ```ruby numbers = [1, 2, 3] sum = numbers.inject(0) { |total, num| total + num } # Python: from functools import reduce numbers...

    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)。...

    programming ruby

    尽管描述中提到这本书是全英文的,但它对于希望深入了解Ruby的程序员来说,无疑是一份宝贵的资源。 ### Ruby中的Hash类 在Ruby中,`Hash`是一种数据结构,用于存储键值对集合。它类似于数组,但与数组不同的是,`...

    深入理解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中实现齐夫...

    21个你应该知道的Ruby编程技巧

    以下是从标题、描述和部分内容中提炼的21个你应该知道的Ruby编程技巧: 1. **快速获取正则表达式的匹配值** 通过使用`String#[]`方法,你可以直接匹配正则表达式,避免了`match`方法可能抛出的异常。例如,`email...

    inject-rewrite:创客学院

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

    ruby-algorithmic-strategies

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

Global site tag (gtag.js) - Google Analytics