2011-05-14 33 views
20

Tengo problemas para encontrar un ejemplo autorizado o una discusión sobre este concepto. Si tengo 2 variables en mi método Ruby que son números, y necesito inicializarlos a cero. Se usarán como contadores. ¿Está esto bien o seguro? Funciona en mis pruebas.Inicializar dos variables en la misma línea

lugar de esto:

foo = 0 
bar = 0 

Usted puede hacer esto?

foo = bar = 0 

Parece una buena manera de ahorrar en líneas y seguir siendo expresivo. ¿O es una mala práctica? Me doy cuenta de que estaría sacrificando la legibilidad un poco. Pero, en un pequeño método de Ruby (< 10 líneas), eso podría no ser una preocupación válida.

Respuesta

15

En muchos idiomas, este último asigna el mismo objeto a ambas variables, lo que puede ser un problema si el objeto es mutable. Mejor hacer esto:

foo, bar = 0, 0 
+0

Verdadero en algunos idiomas, pero irrelevante en Ruby para la pregunta hecha. OMI está completamente bien. – Phrogz

+0

@Phrogz, esto funciona bien en Ruby. – jasonleonhard

+1

Funciona bien, pero no se recomienda, es menos legible. https://github.com/bbatsov/ruby-style-guide#parallel-assignment –

1

Es seguro y funciona.

Depende completamente de su estándar de codificación si algo como esto está mal visto o no.

Úselo y váyase para una refactorización posterior cuando llegue el momento.

25

Es una buena práctica inicializar dos variables en la misma línea siempre que el valor asignado sea corto y fácil de seguir. Incluso puede asignar dos valores diferentes usando la sintaxis de la matriz.

foo = bar = 123 
foo #=> 123 
bar #=> 123 

foo, bar = 1, 2 
foo #=> 1 
bar #=> 2 
+1

¡Gracias! Me gusta mucho: foo, bar = 1, 2 No había pensado en eso. Y todavía es legible. – mrjabba

30

Esto funciona, pero debes saber que solo es seguro para tu situación porque estás usando las variables para los números, que son inmutables en Ruby. Si ha intentado lo mismo con una cadena, por ejemplo, usted podría terminar con un comportamiento que no esperaba:

ruby-1.9.2-p180 :001 > foo = bar = "string" 
=> "string" 
ruby-1.9.2-p180 :002 > foo.upcase! 
=> "STRING" 
ruby-1.9.2-p180 :003 > bar 
=> "STRING" 
7

Esto es raro.

Ignacio Vazquez-Abrams respuesta es cierto para inicializar variables con valores diferentes con:
a, b = 123, 456

embargo, creo que su preocupación es en hacer lo siguiente:
a = b = "hello"

pero espera! La línea anterior asigna la misma dirección de memoria para las variables a y b, es decir,
a.object_id y b.object_id son iguales. Entonces cualquier cambio en a persistiría en b.

No me gusta, pero podría ser una solución alternativa.
x = "a very long string or something you don't want to type multiple times"
a, b, c = x.clone, x.clone, x.clone

Oh Me gustaría que hubiera una manera elegante de hacer esto.

+0

Eso me parece muy elegante ... –

Cuestiones relacionadas