Ruby相当于C#Linq Aggregate方法

Ram*_*Vel 5 c# ruby linq aggregate jruby

什么是相当于Linq Aggregate方法的红宝石.它的工作原理是这样的

  var factorial = new[] { 1, 2, 3, 4, 5 }.Aggregate((acc, i) => acc * i);
Run Code Online (Sandbox Code Playgroud)

每次将数组序列中的值传递给lambda时,变量acc都会累积.

Jör*_*tag 15

这通常被称为数学折叠以及几乎任何编程语言.它是一个更为笼统的概念的一个实例.Ruby从Smalltalk继承了它的这个特性的名称,在那里它被调用inject:into:(用得像aCollection inject: aStartValue into: aBlock.)所以,在Ruby中,它被调用inject.它也有别名reduce,这有点不幸,因为这通常意味着略有不同.

您的C#示例在Ruby中看起来像这样:

factorial = [1, 2, 3, 4, 5].reduce(:*)
Run Code Online (Sandbox Code Playgroud)

虽然其中一个可能更惯用:

factorial = (1..5).reduce(:*)
factorial = 1.upto(5).reduce(:*)
Run Code Online (Sandbox Code Playgroud)

  • @Andrew Grimm:实际上,这不是`Symbol#to_proc`(请注意丢失的&符号).`Enumerable#inject`有一个"重载",它带有折叠操作的符号.例如,这不适用于`Enumerable#collect`. (2认同)
  • +1使用"catamorphism"一词.我发誓,每当我读到你的一篇帖子时,我都要看一些东西. (2认同)