2011-06-16 12 views

Respuesta

20

usted puede hacerlo utilizando la siguiente:

e,m,p,t... = Array.new(10) { [] } 

Resulta

[[]]*10 

no es el camino correcto a seguir, [[]]*10 es para la repetición y se acaba repitiendo el mismo objeto [] 10 veces, por lo que todas las variables terminarían siendo asignadas al mismo objeto.

+2

La primera solución es buena (aunque h solo puede hacer 'Array.new (10) {[]}'). Sin embargo, su segunda solución tiene un gotcha. Si una de las variables se modifica (por ejemplo, 'e <<" foo "'), entonces 'm',' p', 't' etc. también se modifican. –

+0

@Andrew Grimm Sí, así es como empecé en realidad, pensé por qué no solo [] en lugar de Array.new dentro del bloque, y luego procedí a tratar de eliminar el primer Array.new también. ¡Pero esto es extraño! Acabo de confirmar lo que dijiste, ¿puedes explicar por qué es así? –

+0

@Dhruva: Es la misma matriz referida a 10 veces, en lugar de 10 matrices distintas. Puede averiguarlo llamando 'object_id' en el objeto. –

6

Como declaración de variables múltiples en una sola línea a1, a2, a3 = 3, 10, 4

e, m, p, t ... = [], [], [], [] ... 
4

tengo curiosidad a lo que son esos 10 conjuntos diferentes, porque sospecho que no deberían ser 10 variables diferentes, pero sólo uno. No dar ningún sentido, por lo que sólo puede adivinar, algo así como lo siguiente podría mejor:

whatever = Hash.new{|h, k| h[k] = []} 
whatever[:e] # => [] 
whatever[:m] << 42 
whatever[:m] # => [42] 
# etc... 

lo contrario, como Zomboid escribió:

e, m, p, t ... = [], [], [], [] ... 
+0

¡Punto de interés! En realidad, son 10 variables diferentes en este caso porque se utilizan con fines completamente distintos. Gracias por ese enfoque alternativo. +1 – sscirrus

3

Lo que todo falla

> p, q, r = v = Array.new(3, []) 
=> [[], [], []] 
> v.map(&:object_id) 
=> [70155104393020, 70155104393020, 70155104393020] 
> p = q = r = [] 
=> [] 
> [p, q, r].map(&:object_id) 
=> [70155104367380, 70155104367380, 70155104367380] 

Lo que funciona

> p, q, r = v = Array.new(3){ [] } 
=> [[], [], []] 
> v.map(&:object_id) 
=> [70155104731780, 70155104731760, 70155104731740] 
Cuestiones relacionadas