2011-02-05 27 views
80

Me inicializar una matriz de esta manera:¿Cómo inicializar una matriz en un solo paso con Ruby?

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

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

+15

+1 solo para nuevas pulsaciones repetidas de una sola línea. :) – Phrogz

+1

@Phrogz ligeramente más corto: 'array = Array.new << 1 << 2 << 3';) –

+0

@AlexanderSuraphel Eso crea una matriz de Fixnums en lugar de una matriz de cadenas. – Phrogz

Respuesta

156

Como otros han señalado, se puede utilizar una matriz literal:

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

Puede también, por su ejemplo, utilizar una gama:

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

Para matrices de muchas cadenas delimitadas por espacios en blanco, lo más fácil es esta notación:

array = %w[ 1 2 3 ] 

En general, se puede pasar de un bloque a Array.new y usarlo para determinar cuál es el valor de cada entrada será:

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

Por último, aunque no produce la misma matriz de tres cuerdas como en 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] 
+4

Más uno para la respuesta detallada, aunque prefiero splat sobre 'to_a' (' [* '1' .. '3'] '). –

+0

@MichaelKohl Estoy de acuerdo; Estaba bajo la (equivocada) impresión de que no se podían marcar los rangos en 1.8.6. Añadiré eso, gracias! Tenga en cuenta que no necesita splat dentro de una matriz literal (a menos que esté formateando junto con el splat). – Phrogz

+0

Lo sé, es solo que uso splat para ese propósito (composición que sí lo es) y también me gusta que muestre con qué terminas. –

2

Para crear una matriz de modo que podría hacer:

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

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

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

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

array = %w{1 2 3}

acaba de separar cada elemento con cualquier espacio en blanco

8

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

=> [*'1'.."5"] #remember * 
    => ["1", "2", "3", "4", "5"] 
+1

En 1.9 también puede hacerlo de esta manera: '>> [*? 1 ..? 5] # => [" 1 "," 2 "," 3 "," 4 "," 5 "]'. –

11

Oneliner:

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'] 
+2

¿por qué alguien votaría esto ...? – pankajdoharey

+8

No lo voté, pero estoy adivinando porque esto invocó tres métodos y crece de manera incremental la matriz, en oposición a '[1,2,3]' que hace una única inicialización. Además, el tuyo es más personajes. Además, ha creado una matriz de Fixnums mientras que OP estaba preguntando sobre una matriz de cadenas. – Phrogz

7

Para demostrar Hay más de Uno Seis maneras de hacerlo:

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

Si 1.Método (+) no fue posible, también se puede hacer

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

Claro, es una exageración en este escenario, pero si plus_1 fue un tiempo muy largo expresión, puede que desee para ponerlo en una línea separada de la creación de matriz

0

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

array = %w(1 2 3) 

Se añadirá la matriz valores 1,2,3 a la impresión arrayand a cabo la salida como ["1", "2", "3"]

2

Usted puede hacer

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

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

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. Así que si quieres una matriz cuyos elementos son números enteros, no se debe envolver cada elemento con apóstrofes:

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 lo hace (lo que hacía a menudo por error), como en:

wrong_array = %w(1, 2, 3) 

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

puts wrong_array 

la salida será:

1, 
2, 
3 
=>nil 

que no es lo que quiere aquí.

Espero que esto ayude a aclarar el punto!

Cuestiones relacionadas