2008-10-10 14 views
154

estoy trabajando a través de un libro que da ejemplos de rangos se convierte en matrices equivalentes usando sus métodos "to_a"manera correcta para rellenar una matriz con un rango en Ruby

Cuando corro el código en IRB consigo el siguiente advertencia

warning: default `to_a' will be obsolete 

¿Cuál es la alternativa correcta al uso de to_a?

¿hay maneras alternativas de poblar una matriz con un rango?

+6

La gran advertencia para convertir un rango en una matriz, i un gran alcance puede consumir mucha memoria cuando se construye el conjunto, por lo tanto, úselo con cuidado. En lugar de crear la matriz, podría ser mejor iterar sobre el rango como lo haría con una matriz para mantener bajo el consumo de memoria. Es una de esas cosas de "aplicar según sea necesario". –

Respuesta

290

puede crear una matriz con un rango utilizando splat,

>> a=*(1..10) 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

usando KernelArray método,

Array (1..10) 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

o el uso de to_a

(1..10).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
+1

¿Qué sucede si la matriz ya está creada y desea agregarle un rango? Tengo 'order = 1'. Luego 'pida << (2.25) .to_a'. Pero esto crea otra matriz dentro de la matriz, simplemente quiero que el rango sea de 2 a 25. Sin embargo, si intento 'order << (2.25)' obtengo el error, no puedo convertir Range en Integer. – kakubei

+1

@kakubei usa 'concat' en lugar de' << '. Además, no debería obtener "no se puede convertir el rango en entero" a menos que "orden" sea un número entero, en cuyo caso estaría cambiando de bit, no anexando un array. – Kelvin

+2

la opción Splat no funciona para Ruby 1.8.7, yo recomendaría usar '(1..10) .to_a' para compatibilidad con versiones anteriores – halfcube

75

Esto funciona para mí en IRB:

irb> (1..4).to_a 
=> [1, 2, 3, 4] 

noto que:

irb> 1..4.to_a 
(irb):1: warning: default `to_a' will be obsolete 
ArgumentError: bad value for range 
     from (irb):1 

Así que tal vez se echa en falta los paréntesis?

(Me postulo Rubí 1.8.6 Patchlevel 114)

+6

** Explicación **: sin el paréntesis, está llamando al método to_a de una instancia de la clase Fixnum (en este caso 4), no del rango 1..4. Si ejecuta 'Fixnum.methods.include? (To_a)' en ruby ​​1.9.2 notará que el método to_a ya no está definido, por lo tanto, ¿por qué estaba recibiendo ese mensaje de depreciación en 08 – Pierre

+0

@Pierre Creo que quería decir 'Fixnum.instance_methods.include? (: To_a)' – Kelvin

+0

@Kelvin - En realidad, ' methods.include? 'es más informativo: ' $ irb' 'irb (main): 001: 0> Fixnum.methods.include? (to_a)' '(irb): 1: warning: default' to_a 'will ser obsoleto '=> falso' ' irb (main): 002: 0> Fixnum.instance_methods.include? (: to_a) ' ' => false' –

33

Parece que usted está haciendo esto:

0..10.to_a 

La advertencia es del Fixnum # to_a, no de la gama # to_a. Tal vez puedas probar:

(0..10).to_a 
3

Sólo traté de utilizar rangos de mayor a menor cantidad y consiguió el resultado que no esperaba:

irb(main):007:0> Array(1..5) 
=> [1, 2, 3, 4, 5] 
irb(main):008:0> Array(5..1) 
=> [] 

Eso es debido a rangos implementaciones.
así que tuve que utilizar la siguiente opción:

(1..5).to_a.reverse 
+2

Hoy descubrí '5.downto (1) .to_a' que es otra forma de expresar un rango decreciente https://stackoverflow.com/a/8927009/703903 – odlp

6

Comprobar esto:

a = [*(1..10), :top, *10.downto(1)] 
+2

El * 10.downto (1) era lo que estaba buscando porque, gracias! – Daniel

0

Ésta es otra manera:

IRB> [* 1..10]

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Cuestiones relacionadas