我正在研究Ruby,并且遇到了注入.我正处于理解它的尖端,但当我是那种需要真实世界的例子来学习某些东西的人.我遇到的最常见的例子是人们使用注入来累加(1..10)范围的总和,我可能不在乎.这是一个随意的例子.
在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必拥有一个以网络为中心的例子.我只需要一些有目的的东西,我可以把头包裹起来.
谢谢大家.
inject有时可以通过其"其他"名称更好地理解reduce.它是一个在Enumerable(迭代它一次)上运行并返回单个值的函数.
有许多有趣的方法可以使用,特别是当与其他Enumerable方法链接时,例如map.通常情况下,它可以是一种更简洁和富有表现力的做事方式,即使有另一种方法可以做到这一点.
像这样的例子起初可能看起来毫无用处:
range.inject {|sum, x| sum += x}
Run Code Online (Sandbox Code Playgroud)
range但是,变量不必是简单的显式范围.它可以是(例如)从数据库返回的值列表.如果您运行的数据库查询返回购物车中的价格列表,您可以使用.inject它们汇总所有并获得总计.
在简单的情况下,您可以在SQL查询本身中执行此操作.在一个更困难的情况下,例如某些项目已经添加了税,而有些项目没有,有些类似的东西inject会更有用:
cart_total = prices.inject {|sum, x| sum += price_with_tax(x)}
Run Code Online (Sandbox Code Playgroud)
当Enumerable需要比简单数值需要更详细处理的复杂类中的对象,或者当Enumerable包含需要在处理之前转换为公共类型的不同类型的对象时,这种事情也特别有用.由于inject需要一个块,您可以在此处使功能变得复杂,因为您需要它.
这个简短的视频(1分钟)是我遇到的新手注入的最佳解释().
这篇博文有一些inject()示例.
以下是一些实际的inject()示例:
[1, 2, 3, 4].inject(0) {|memo, num| memo += num; memo} # sums all elements in array
Run Code Online (Sandbox Code Playgroud)
该示例遍历[1,2,3,4]数组的每个元素,并将元素添加到memo变量(memo通常用作块变量名称).此示例在每次迭代后显式返回memo,但返回也可以是隐式的.
[1, 2, 3, 4].inject(0) {|memo, num| memo += num} # also works
Run Code Online (Sandbox Code Playgroud)
inject()在概念上类似于以下显式代码:
result = 0
[1, 2, 3, 4].each {|num| result += num}
result # result is now 10
Run Code Online (Sandbox Code Playgroud)
inject()对于创建数组和散列也很有用.以下是如何使用inject()转换[['dogs', 4], ['cats', 3], ['dogs', 7]]为{'dogs' => 11, 'cats' => 3}.
[['dogs', 4], ['cats', 3], ['dogs', 7]].inject({'dogs' => 0, 'cats' => 0}) do |memo, (animal, num)|
memo[animal] = num
memo
end
Run Code Online (Sandbox Code Playgroud)
这是一个更通用和优雅的解决方案:
[['dogs', 4], ['cats', 3], ['dogs', 7]].inject(Hash.new(0)) do |memo, (animal, num)|
memo[animal] = num
memo
end
Run Code Online (Sandbox Code Playgroud)
同样,inject()在概念上类似于以下代码:
result = Hash.new(0)
[['dogs', 4], ['cats', 3], ['dogs', 7]].each do |animal, num|
result[animal] = num
end
result # now equals {'dogs' => 11, 'cats' => 3}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
905 次 |
| 最近记录: |