ruby inject 的使用
此随笔来源于 https://www.iteye.com/blog/biyeah-1286449
看到这个介绍 言简意赅 通俗易懂 故转载,方便后面查阅。望见谅!
刚接触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"]
是不是更直观?
文章后面还提到复杂的应用,有些还看不明,以后看明也再补充吧,有兴趣的读者可以直接看原文。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话