`

ruby inject,循环计算优化

阅读更多

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

 

分享到:
评论

相关推荐

    VC代码 RT_INJECT (实用代码源)

    VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码源)VC代码 RT_INJECT (实用代码...

    javax-inject-1.0-201002241208.jar.zip

    《Java注射框架——javax.inject详解》 在Java开发中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它能够使代码更加灵活、可测试和易于维护。javax.inject是Java平台上的一个标准注入API,它是JSR ...

    InjectDLL_injectDll_

    Usage: injectdll.exe [process name] [dll path] [option number]option 1 - CreateRemoteThreadoption 2 - NtCreateThreadExoption 3 - RtlCreateUserThread

    Ruby Data-Processing ruby数据处理

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

    官方jar包javax-inject.jar

    【标题】"官方jar包javax-inject.jar"指的是Java编程语言中的一个官方发布的库文件,主要包含`javax.inject`包下的类和接口。这个jar包是Java依赖注入(Dependency Injection,简称DI)的一个实现,主要用于简化对象...

    javax.inject.Provider

    Spring 依赖的 javax.inject.Provider

    vue 解决provide和inject响应的问题

    官网上说provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。 provide: Object | () =&gt; Object(一个对象或返回一个对象的函数) inject...

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

    Ruby中有很多高效的编程习惯和技巧,例如使用块(blocks)、Proc对象和Lambda表达式来替代循环结构。`fast-ruby` 项目提供了这些方面的比较,展示了如何通过改变编程习惯来提高代码执行速度。 2. **方法调用优化**...

    Location IOS12.4驱动版本,包含inject.dmg和inject.dmg.signature两个文件

    "inject.dmg"和"inject.dmg.signature"这两个文件在iOS系统中具有特殊的意义。通常,".dmg"文件是Disk Image的缩写,它是Mac OS X系统中的一个镜像文件格式,用于存储和分发软件。在iOS上下文中,".dmg"文件可能被...

    Location IOS13驱动版本,包含inject.dmg和inject.dmg.signature两个文件

    在iOS 13中,位置服务有了显著的改进和优化,包括更精确的定位,更高的隐私保护以及对后台应用访问位置数据的严格控制。例如,用户现在可以设置“一次位置”权限,只允许应用在特定的一次使用中获取位置信息。此外,...

    javax-inject.jar.zip

    "javax-inject.jar" 是一个专门用于解决此类问题的库,它包含了`javax.inject`包,这个包是Java注射注入(Dependency Injection,简称DI)的一个重要组成部分。在本文中,我们将深入探讨`javax.inject`包的作用、...

    autoinject小工具

    《自动注入工具——AutoInject小析》 在网络安全领域,DLL注入是一种常见的技术,它允许一个进程将自身的代码注入到另一个进程中执行,从而实现各种目的,如监控、调试或者恶意攻击。本文主要针对名为"AutoInject...

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

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

    CodeInject.rar

    code inject 逆向工程 做一些工具必备

    ruby实用函数和实例

    此外,Enumerable模块是一组用于遍历和操作集合的强大工具,它包含的`inject`和`reduce`方法可以执行聚合操作,`group_by`则可以按条件对元素分组。 Ruby的模块(Module)和类(Class)系统使得代码组织和复用变得...

    前端开源库-postcss-inject

    PostCSS本身是一个框架,它接收CSS作为输入,然后通过一系列的插件进行处理,最后输出优化过的CSS。这些插件可以完成各种任务,如自动添加浏览器前缀、转换CSS新语法、移除未使用的CSS规则等。而PostCSS Inject则是...

    sisu-inject-bean-1.4.2.jar

    sisu-inject-bean-1.4.2.jar

    Inject HTTP.zip_Inject HTTP vb6_Inject2Download_http inject_inje

    标题中的"Inject HTTP.zip_Inject HTTP vb6_Inject2Download_http inject_inje"暗示了这个压缩包文件可能包含了关于在VB6(Visual Basic 6)环境下实现HTTP注入的技术和工具。HTTP注入通常指的是向HTTP请求中插入...

    前端开源库-inject-html

    6. **性能优化**:为了减少DOM操作的性能开销,可能采用了延迟加载、批量更新等策略。 7. **版本管理**:通过Git进行版本控制,master分支代表了项目的主线发展。 8. **社区支持**:开源意味着有活跃的社区,...

Global site tag (gtag.js) - Google Analytics