¿Cómo inicializar una matriz en un paso usando Ruby?

105

Inicializo una matriz de esta manera:

array = Array.new
array << '1' << '2' << '3'

¿Es posible hacer eso en un solo paso? ¿Si es así, cómo?

user502052
fuente
20
+1 solo para nuevos empujes repetidos de una sola línea. :)
Phrogz
1
@Phrogz un poco más corto:; array = Array.new << 1 << 2 << 3 )
Alexander Suraphel
@AlexanderSuraphel Eso crea una matriz de Fixnums en lugar de una matriz de cadenas.
Phrogz
1
@Phrogz Solo quería mencionar que incluso puede ser más corto. Solo tienes que cambiarte 1a '1'.
Alexander Suraphel

Respuestas:

192

Puede usar un literal de matriz:

array = [ '1', '2', '3' ]

También puede utilizar un rango:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

Para matrices de cadenas delimitadas por espacios en blanco, puede usar la sintaxis de cadena de porcentaje :

array = %w[ 1 2 3 ]

También puede pasar un bloque a Array.newpara determinar cuál será el valor de cada entrada:

array = Array.new(3) { |i| (i+1).to_s }

Finalmente, aunque no produce la misma matriz de tres cadenas que las otras respuestas anteriores, tenga en cuenta también que puede usar enumeradores en Ruby 1.8.7+ para crear matrices; por ejemplo:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]
Phrogz
fuente
4
Más uno para la respuesta detallada, aunque prefiero splat sobre to_a( [*'1'..'3']).
Michael Kohl
@MichaelKohl Estoy de acuerdo; Tenía la impresión (equivocada) de que no se podían dividir rangos en 1.8.6. ¡Agregaré eso, gracias! Tenga en cuenta que no necesita splat dentro de un literal de matriz (a menos que esté componiendo junto con el splat).
Phrogz
Lo sé, es solo que uso principalmente splat para ese propósito (composición, eso es) y también me gusta que muestre con qué terminas.
Michael Kohl
2
Además, se puede usar el método de clase Array :: []: Array[ "1","2","3"] #=> ["1","2","3"](no creo que este método tenga nada que ver con el constructor literal de matriz). También puede usar el Kernel # Array de nivel superior (el nombre del método parece un nombre de clase)Array(1..5) #=> [1,2,3,4,5]
b1_
¿Qué hace el *? ¿Dónde puedo encontrar documentación para eso?
Arnold Roa
22

Un trazador de líneas:

array = [] << 1 << 2 << 3   #this is for fixnums.

o

 a = %w| 1 2 3 4 5 |

o

 a = [*'1'..'3']

o

 a = Array.new(3, '1')

o

 a = Array[*'1'..'3']
pankajdoharey
fuente
8
No lo voté en contra, pero supongo que porque esto invocó tres métodos y aumenta gradualmente la matriz, a diferencia de lo [1,2,3]que hace una sola inicialización. Además, el tuyo es más personajes. Además, ha creado una matriz de Fixnums mientras que el OP estaba preguntando por una matriz de cadenas.
Phrogz
8

Junto con las respuestas anteriores, también puede hacer esto

    =>  [*'1'.."5"]   #remember *
    => ["1", "2", "3", "4", "5"]
RameshVel
fuente
1
En 1.9 también puede hacerlo de esta manera: >> [*?1..?5] #=> ["1", "2", "3", "4", "5"].
Michael Kohl
7

Para demostrar que hay más de una seis formas de hacerlo:

plus_1 = 1.method(:+)
Array.new(3, &plus_1) # => [1, 2, 3]

Si 1.método (: +) no fuera posible, también podría hacerlo

plus_1 = Proc.new {|n| n + 1}
Array.new(3, &plus_1) # => [1, 2, 3]

Claro, es exagerado en este escenario, pero si plus_1fuera una expresión muy larga, es posible que desee ponerla en una línea separada de la creación de la matriz.

Andrew Grimm
fuente
3

Tu puedes hacer

array = ['1', '2', '3']

Como han señalado otros, también puede inicializar una matriz con la notación% w así:

array = %w(1 2 3)

o

array = %w[1 2 3]

Tenga en cuenta que en ambos casos cada elemento es una cadena, en lugar de un número entero. Entonces, si desea una matriz cuyos elementos sean números enteros, no debe envolver cada elemento con apóstrofos:

array_of_integers = [1, 2, 3]

Además, no es necesario poner una coma entre los elementos (lo cual es necesario cuando se crea una matriz sin esta notación% w). Si hace esto (que a menudo hice por error), como en:

wrong_array = %w(1, 2, 3)

sus elementos serán tres cadenas ---- "1,", "2,", "3". Entonces, si lo hace:

puts wrong_array

la salida será:

1,
2,
3
=>nil

que no es lo que queremos aquí.

¡Espero que esto ayude a aclarar el punto!

Taiga
fuente
2

Para crear una matriz de este tipo, puede hacer:

array = ['1', '2', '3']
Reese Moore
fuente
2

Si tiene una matriz de cadenas, también puede inicializarla así:

array = %w{1 2 3}

simplemente separe cada elemento con cualquier espacio en blanco

John Douthat
fuente
1

Puede inicializar una matriz en un paso escribiendo los elementos []así:

array = ['1', '2', '3']
sepp2k
fuente
0

Simplemente puede hacer esto con %wnotación en matrices ruby.

array = %w(1 2 3)

Agregará los valores de la matriz 1, 2, 3 a la matriz e imprimirá la salida como ["1", "2", "3"]

Prabhakar Undurthi
fuente