2011-02-18 16 views
5

¿Cuál es el equivalente en rubí del método de agregación de Linq? Funciona algo asíRuby equivalente de C# Método de agregación de Linq

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

la acc variables se está acumulando cada vez que el valor de la secuencia matriz se pasa a la lambda ..

+1

Se llama 'reduce' - ver http: // en.wikipedia.org/wiki/Fold_%28higher-order_function%29 para el equivalente en varios idiomas. – Gabe

+1

Probablemente deberías hacer de este comentario una respuesta para que Ramesh pueda marcarlo como la respuesta aceptada. – chuckj

Respuesta

14

Esto generalmente se llama un pliegue en matemáticas, así como casi cualquier lenguaje de programación. Es una instancia del concepto más general de un catamorfismo . Ruby hereda su nombre para esta función de Smalltalk, donde se llama inject:into: (usado como aCollection inject: aStartValue into: aBlock.). Por lo tanto, en Ruby, se llama inject. También tiene un alias de reduce, lo cual es algo desafortunado, ya que generalmente significa algo ligeramente diferente.

Su ejemplo de C# sería algo como esto en Rubí:

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

Aunque uno de estos sería probablemente más idiomática:

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

gracias Jörg por la información ... – RameshVel

+0

Me encanta 'Symbol # to_proc' for arithmetic! –

+2

@Andrew Grimm: En realidad, esto no es 'Symbol # to_proc' (fíjese en el símbolo que falta). 'Enumerable # inject' tiene una" sobrecarga "que toma un símbolo para la operación de plegado. Esto no funcionará con 'Enumerable # collect', por ejemplo. –

2

Ver Enumerable#inject.

Uso:

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

Como señala @Gabe, también tiene el alias 'reducir', y ese es realmente el término matemático. –

+0

nice ... funciona como se esperaba ... :) – RameshVel

Cuestiones relacionadas