Necesito hacer algo como lo siguientecrear muchas matrices en una línea
e = []
m = []
p = []
t = []
...and so on for about 10 different arrays
¿Hay una manera de crear todas estas matrices en una línea?
Necesito hacer algo como lo siguientecrear muchas matrices en una línea
e = []
m = []
p = []
t = []
...and so on for about 10 different arrays
¿Hay una manera de crear todas estas matrices en una línea?
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.
Como declaración de variables múltiples en una sola línea a1, a2, a3 = 3, 10, 4
e, m, p, t ... = [], [], [], [] ...
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 ... = [], [], [], [] ...
¡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
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]
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. –
@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í? –
@Dhruva: Es la misma matriz referida a 10 veces, en lugar de 10 matrices distintas. Puede averiguarlo llamando 'object_id' en el objeto. –