2011-02-15 19 views
10

puedo encontrar este código en Ruby a ser bastante intrigante"(1..4) .inject (y +)" trabajo en Rubí

(1..4).inject(&:+) 

Ok, ya sé lo inject hace, y yo saber que este código es básicamente equivalente a

(1..4).inject(0) {|a,n| a + n} 

pero ¿cómo funciona exactamente?

¿Por qué &:+ es lo mismo que escribir el bloque {|a,n| a + n}?

¿Por qué no necesita un valor inicial? Estoy bien con el valor inicial es 0, pero (1..4).inject(&:*) funciona también, y no el valor inicial debe ser de 1 ...

+8

Estas son realmente dos preguntas completamente separadas, la primera de las cuales es un duplicado de no menos de otras 11 preguntas que ya han sido Preguntado y respondido aquí en StackOverflow: http://StackOverflow.Com/q/99318/ http://StackOverflow.Com/q/1217088/ http://StackOverflow.Com/q/1792683/ http://StackOverflow.Com/q/1961030/http://StackOverflow.Com/q/2096975/ http://StackOverflow.Com/q/2211751/ http://StackOverflow.Com/q/2259775/ http://StackOverflow.Com/q/2388337/http://StackOverflow.Com/q/2697024/ http://StackOverflow.Com/q/3888044/ http://StackOverflow.Com/q/4512587/ –

Respuesta

14

De Ruby documentation:

Si especifica un símbolo en su lugar, a continuación, cada elemento en la colección se pasa al método llamado de memo

por lo tanto, la especificación de un símbolo es equivalente a pasar el bloque siguiente: {|memo, a| memo.send(sym, a)}

Si no especifica explícitamente un valor inicial para la nota, entonces utiliza el primer elemento de colección que se utiliza como el valor inicial de la nota.

Entonces, no hay magia, Ruby simplemente toma el primer elemento como el valor inicial y comienza a inyectar desde el segundo elemento. Puede verificarlo escribiendo [].inject(:+): devuelve nil en oposición a [].inject(0, :+) que devuelve 0.

Editar: No he notado el signo y. No lo necesita, inject funcionará con un símbolo. Pero si lo escribe, el símbolo se convierte en bloque, puede ser útil con other methods

+1

+1. ¿Puedes agregar una explicación de por qué &: + también funciona? – tokland

+0

@tokland Básicamente es la misma conversión pero funciona con cualquier método, la respuesta principal en la pregunta vinculada tiene una buena explicación. – adamax

Cuestiones relacionadas