C#Linq聚合方法的Ruby等价

C#Linq聚合方法的Ruby等价,c#,ruby,linq,jruby,aggregate,C#,Ruby,Linq,Jruby,Aggregate,Linq聚合方法的ruby等价物是什么。它是这样工作的 var factorial = new[] { 1, 2, 3, 4, 5 }.Aggregate((acc, i) => acc * i); 每次将数组序列中的值传递给lambda时,变量acc都会累积。请参阅 用法: a = [1,2,3,4,5] factorial = a.inject(1) do |product, i| product * i end 这在数学和几乎任何编程语言中都被称为折叠。这是一个更一般的类

Linq聚合方法的ruby等价物是什么。它是这样工作的

  var factorial = new[] { 1, 2, 3, 4, 5 }.Aggregate((acc, i) => acc * i);
每次将数组序列中的值传递给lambda时,变量acc都会累积。

请参阅

用法:

a = [1,2,3,4,5]
factorial = a.inject(1) do |product, i|
  product * i
end
这在数学和几乎任何编程语言中都被称为折叠。这是一个更一般的类同构概念的例子。Ruby从Smalltalk继承了这个特性的名称,在Smalltalk中它被称为
inject:into:
(类似于
aCollection inject:aStartValue into:aBlock.
),因此在Ruby中它被称为
inject
。它还别名为
reduce
,这有点不幸,因为这通常意味着略有不同

在Ruby中,您的C#示例类似如下:

factorial = [1, 2, 3, 4, 5].reduce(:*)
尽管其中一个可能更为惯用:

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

它被称为
reduce
——请参阅各种语言中的等效词。您可能应该将此注释作为一个答案,以便Ramesh可以将其标记为已接受的答案。正如@Gabe指出的,它还有别名
reduce
,这才是真正的数学术语。我喜欢
Symbol#to_proc
用于算术@安德鲁·格里姆:实际上,这不是
Symbol#to_proc
(注意缺少的符号和)
Enumerable#inject
有一个“重载”,它为折叠操作使用一个符号。这不适用于
可枚举的#collect
,例如,+1用于使用单词“亚同态”。我发誓,每次我读你的帖子,我都得查一些东西。但是如果你认为“reduce”是不幸的,为什么要在答案中使用它呢?:-)inject在社区中使用得更多(在我安装的gems中搜索显示1910对13)。也许值得添加一个使用“扩展”用法的示例:1.upto(5).inject{acc,x}acc*x}