Ruby相当于C#Linq Aggregate方法

时间:2011-02-18 01:42:39

标签: c# ruby linq jruby aggregate

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

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

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

2 个答案:

答案 0 :(得分:14)

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

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

factorial = [1, 2, 3, 4, 5].reduce(:*)

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

factorial = (1..5).reduce(:*)
factorial = 1.upto(5).reduce(:*)

答案 1 :(得分:2)

请参阅Enumerable#inject

用法:

a = [1,2,3,4,5]
factorial = a.inject(1) do |product, i|
  product * i
end