2012-01-09 12 views
6

Quiero llamar a la función f 5 veces (por ejemplo) y obtener una lista de resultados. En este momento tengo esto:Llamar a una función varias veces y obtener una lista de resultados

(1..5).to_a.map!{f} 

Nota: En este momento f es una función que toma ninguna entrada y devuelve true o false. Entonces, cuando esto se ejecuta, obtengo una lista de 5 true/false valores.

¿Hay una mejor manera de hacer esto utilizando otros elementos de construcción en funciones (posiblemente reduce? Yo tenía esa idea, pero no puede encontrar la manera de usarlo ...)

Respuesta

31
5.times.collect { f } 

(Suponiendo que no hay parámetros. map es un alias para collect; prefiero el nombre collect cuando en realidad la recolección, ya que parece más comunicativo, pero tu caso es distinto)

también prefieren el más largo en lugar de 5.times(1..5).. Esto también parece más comunicativo: no estoy realmente "iterando sobre un rango", estoy "haciendo algo cinco veces".

IMO la respuesta es ligeramente contra-intuitiva en este caso, ya que no estoy realmente ejecutando collect cinco veces, pero collect.5.times { f } no funciona, así que jugamos un poco a un juego mental de todos modos.

+0

wow ... ¡cómo lo extrañé! gracias @Dave Newton, exactamente lo que estaba buscando. – trh178

3

Prueba la forma de bloque del constructor de Array si quieres cero basados ​​argumentos cada vez mayores:

Array.new(5) {|x| (x+1).to_f} # => [1.0, 2.0, 3.0, 4.0, 5.0] 
Array.new(10) { rand } # => [0.794129655156092, ..., 0.794129655156092] 
0

Se podía acortar su código al no poner to_a ... (1..5) es un enumerable por lo funciona con el mapa

(1..5).map!{f}

1

Uso Array.new con un bloque

Array.new(10) { f } 

El valor del índice está disponible si lo desea:

Array.new(10) { |i| f(i) } 

From the docs:

[Con ab lock], se crea una matriz del tamaño dado. Cada elemento de este conjunto se crea pasando el índice del elemento al bloque dado y almacenando el valor de retorno.

Esto ha sido posible desde at least 1.8.7.

Cuestiones relacionadas