Soy totalmente nuevo en el mundo de Ruby y estoy un poco confundido con el concepto de Símbolos. ¿Cuál es la diferencia entre símbolos y variables? ¿Por qué no usar solo variables?
Gracias.
Comentarios
- en Lisp – del que se deriva Ruby – un símbolo es esencialmente el tipo de datos de una variable; eso significa que puede manipular el programa de una manera Reflection-esque mientras se ejecuta (no es la explicación más coherente, lo siento)
Respuesta
Las variables y los símbolos son cosas diferentes. Una variable apunta a diferentes tipos de datos. En Ruby, un símbolo se parece más a una cadena que a una variable.
En Ruby, una cadena es mutable, mientras que un símbolo es inmutable. Eso significa que solo se necesita crear una copia de un símbolo. Por lo tanto, si
x = :my_str y = :my_str
:my_str
solo se creará una vez, y x
y y
apuntan a la misma área de memoria. Por otro lado, si tiene
x = "my_str" y = "my_str"
un cadena contiene ing my_str
se creará dos veces , y x
y y
apuntará a diferentes instancias.
Como resultado, los símbolos se usan a menudo como equivalentes a enumeraciones en Ruby, así como claves para un diccionario (hash).
Comentarios
- Solo para presionar el punto de @mipadi ', cuando comparas una cadena necesitas comparar cada carácter entre sí. Entonces, comparar cadenas idénticas es O (n). Mientras que los símbolos ruby comparan referencias de objetos que es O (1).
- ¿Por qué Python no tiene esto?
- Debe tener cuidado de no abusar de ellos también, ya que, la última vez que supe, pero no he ' t examinado esto en ruby > 1.9, los símbolos no ' t obtienen gc ' d y, por lo tanto, pueden consumir memoria
- Se comportan de manera idéntica en Smalltalk, excepto que se ven como
#mySymbol
. - @ frogstarr78 – A menos que esté generando símbolos mediante programación (intercalando cadenas sin verificarlas primero), no ' tiene que preocuparse por hacer demasiados símbolos.
Respuesta
El símbolo en Ruby es básicamente lo mismo que el símbolo en el mundo real. Se usa para representar o nombrar algo.
Los símbolos se usan muy comúnmente para representar algún tipo de estado, por ejemplo
order.status = :canceled order.status = :confirmed
Usted también puede ver el símbolo como enumeración instantánea. No es necesario definir un símbolo, solo utilícelo. Este artículo lo explica con gran detalle.
Comentarios
- Mejor explicación que la mayoría de ' he visto hasta ahora.
Responder
Por lo general, las variables tienden a confundirse con cadenas, pero puedo entender que lo piense como una variable. Es comprensible. Piénselo de esta manera:
El estado de un jugador en un juego está representado por un número. 1 significa vivo, 2 significa inseguro, 3 significa muerto. Esto se puede reemplazar fácilmente por símbolos. Los símbolos pueden ser :alive
:unsure
y :dead
. Para comprobar si un jugador está vivo, en lugar de hacer esto:
if player_status == 1
Puedes hacer esto:
if player_status == :alive