2010-05-28 9 views
45
a = b = c = d = 5 

puts (a) >> 5 
puts (b) >> 5 
puts (b) >> 5 
puts (b) >> 5 
a= a+1 
puts (a) >> 6 
puts (b) >> 5 

Encontré que no hay problema con la asignación de valores como este. Mi pregunta es, ¿debería uno asignar como el que se da arriba o así?¿Es correcto asignar múltiples variables como esta a = b = c = d = 5?

a , b, c, d = 5, 5, 5, 5 
+1

el ejemplo anterior también funciona muy bien para las negativas '' true' y FALSE :) – MMachinegun

Respuesta

87

La cosa a tener en cuenta aquí es que su caso sólo funciona bien porque los números son inmutables en Ruby. Usted no lo hace quieren hacer esto con cadenas, matrices, hashes o casi cualquier otra cosa que no sea un número, porque sería crear varias referencias al mismo objeto, que es casi seguro que no lo que quiere:

a = b = c = d = "test" 
b << "x" 
=> "testx" 
a 
=> "testx" 

Mientras que la forma paralela es seguro con todos los tipos:

a,b,c,d = "test","test","test","test" 
=> ["test", "test", "test", "test"] 
b << "x" 
=> "testx" 
a 
=> "test" 
+0

thanx glenn muy útil :) – Salil

+0

debería estar bien hacer esto con cualquier cadena que esté pensando en usar como constante, ¿verdad? –

+2

podrías DIBUJAR aún más: 'a, b, c, d =% w (prueba) * 4' – nerfologist

8

No hay nada malo con la asignación de esa manera (a = b = c = d = 5). Personalmente prefiero la asignación múltiple si todas las variables necesitan tener el mismo valor.

Ésta es otra manera:

a, b, c, d = [5] * 4 
+0

Cinco cosas a cuatro variables? –

+3

@Donal: Vaya.Supongo que fue malo para ese extra 5 que nadie quería. :( –

0

No consumo rubí en absoluto, lo que podría ser un lenguaje aceptable, pero a = b = c = d = 5 se ve bastante feo para mí. a , b, c, d = 5, 5, 5, 5 se ve mucho mejor, IMO.

+0

5,5,5,5 no es demasiada repitition? –

+0

@ArnoldRoa es un poco más fácil de mantener que [5] * 4, IMO – drusepth

6

Si se siente bien, hágalo.

El lenguaje lo permite, como descubrió, y se comporta como era de esperar. Sugeriría que la única pregunta que debe hacerse se refiere a la expresividad: ¿el código le dice cuál es su propósito?

Personalmente, no me gusta especialmente utilizar esta construcción para mucho más que la inicialización de valores predeterminados, preferiblemente cero. Idealmente, las variables así inicializadas también tendrían un propósito similar, contadores, por ejemplo. Pero si tuviera más de un par de variables de propósito similar, podría considerar declararlas como una forma de duplicado, para refactorizarlas en, por ejemplo, un Hash.

+0

+1, esta es la respuesta correcta. No estoy seguro de qué forma es más idiomático, pero solo puedo pensar en pocos casos en los que se necesite tal asignación. –

4

Estas dos inicializaciones expresan un significado diferente. El a = b = c = d = 5 significa que "todas mis variables deben inicializarse con el mismo valor, y este valor es 5". El otro, a, b, c, d = 5, 5, 5, 5, significa "Tengo una lista de variables y la correspondiente lista de valores init".

¿Su lógica es tal que todas las variables deberían ser siempre las mismas? Entonces el primero es mejor. Si no, el segundo podría ser mejor. Otra pregunta: ¿es comprensiva su lista de 4 variables? ¿Es probable que agregue o elimine otra variable a este grupo? Si es así, me gustaría sugerir otra variante en su lugar:

a = 5 
b = 5 
c = 5 
d = 5 
3

una vez le picaron con eso. Puede ahorrarte unas pocas pulsaciones de teclado hoy pero viene a morderte más tarde. Como @glenn mencionó, crea múltiples referencias al mismo objeto.

Ejemplo: Esto se aplica tanto rubí 1.8 y 1.9

> a = b = Array.new 
=> [] 
> a.object_id == b.object_id 
=> true 
> a << 1 
=> [1] 
> b << 2 
=> [1, 2] 
Cuestiones relacionadas