ruby - segundo - Inicializa dos variables en la misma línea
fahrenheit 451 resumen (5)
En muchos idiomas, este último asigna el mismo objeto a ambas variables, lo que puede ser problemático si el objeto es mutable. Mejor hacer esto:
foo, bar = 0, 0
Estoy teniendo problemas para encontrar un ejemplo autorizado o una discusión de este concepto. Si tengo 2 variables en mi método de Ruby que son números, y necesito inicializarlos a cero. Serán utilizados como contadores. ¿Está bien o es seguro? Funciona en mis pruebas.
En lugar de esto:
foo = 0
bar = 0
¿Puedes hacerlo?
foo = bar = 0
Parece una buena forma de ahorrar en líneas y aún así ser expresivo. O, ¿es esta una mala práctica? Me doy cuenta de que estaría sacrificando un poco la legibilidad. Pero, en un método pequeño de Ruby (<10 líneas), eso podría no ser una preocupación válida.
Es seguro y funciona.
Depende completamente de su estándar de codificación si algo como esto está mal visto o no.
Úsalo y déjalo para refactorizar más tarde cuando llegue el momento.
Es una buena práctica inicializar dos variables en la misma línea siempre que el valor que se asigna sea corto y fácil de seguir. Incluso puede asignar dos valores diferentes utilizando la sintaxis de matriz.
foo = bar = 123
foo #=> 123
bar #=> 123
foo, bar = 1, 2
foo #=> 1
bar #=> 2
Esto es raro
La respuesta de Ignacio Vázquez-Abrams es verdadera para inicializar variables con diferentes valores con:
a, b = 123, 456
Pero, creo que su preocupación es 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.
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.
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 intentaste lo mismo con una cadena, por ejemplo, podrías terminar con un comportamiento que no esperabas:
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"