在Ruby中,inject和reduce是相同的吗?

119
我看到它们在这里一起记录:here。它们是同一个东西吗?为什么Ruby有这么多别名(例如数组的map/collect)?非常感谢。
3个回答

167

是的,在许多其他编程语言和数学中,这也被称为fold。Ruby使用很多别名,以便对具有不同背景的程序员具有直观性。如果您想在Array上使用#length,可以。如果您想使用#size,也可以!


4
如果你想创建自己的别名,你可能会对 alias_method 感兴趣。 - Nick McCurdy
25
在Ruby中,“#length”和“#count”并不等价。“#length”和“#size”是等价的。 - Quolonel Questions
10
3.length会出现NoMethodError;3.size返回4。很明显,3不是一个数组,但要注意鸭子类型!(3_000_000_000_000_000.size返回8,而3_000_000_000_000_000_000_000_000_000_000_000_000_000.size返回20;看起来这是它所占用的内存量)。 - ChrisPhoenix
19
我认为当前的 Ruby 文档 http://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-reduce 可能会更好,如果它只是说与 inject 相同,这样用户就不必阅读两个描述并尝试弄清它们是否相同... 这不符合 DRY 原则吗? - nonopolarity
3
+1 在文档中将 inject 和 reduce 放在一起,却没有解释它们的等价关系。更清晰的做法是说明它们是等价的。我因为困惑而进行了谷歌搜索,最终来到这里。 - Homan
显示剩余5条评论

9

最近版本的Enumerable#reduce文档明确指出:

injectreduce方法是别名,它们之间没有性能优劣之分。


1
我喜欢根据使用方式将它们分开,显然只是为了语义上的区分。如果它是一个过程(&:+),则缩减;如果它是一个块,则注入。 - TheRealMrCrowley

4

它们是同一件事吗?

是的,别名最终运行完全相同的代码。

为什么Ruby有这么多别名(例如数组的map / collect)?

这归结于语言的方法。

不同的语言有不同的方法,我尝试在这里将其可视化:

enter image description here

Ruby之所以这样做是为了开发人员的生产力。基本上,通过使用别名,你可以使来自不同编程语言和人类语言背景的程序员更直观地编写代码。

但是,别名也可以帮助你的代码清晰度,因为有些事情可能具有不同的语义可能性,比如方法midnight()也可以表达为 start_of_dayend_of_day。根据上下文这些可能更清晰。

顺便说一句,有些程序员使用injectreduce来区分不同的语义情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接