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 solo usar variables?
en Lisp, de donde se deriva Ruby, un símbolo es esencialmente el tipo de datos para una variable; eso significa que puede manipular el programa de forma reflectante mientras se ejecuta. (no es la explicación más coherente, lo siento)
Paul Nathan
Respuestas:
70
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 tienes
x =:my_str
y =:my_str
:my_strSólo se creará una vez, y xy yapuntan a la misma área de memoria. Por otro lado, si tienes
x ="my_str"
y ="my_str"
una cadena que contiene my_strse creará dos veces , y xy yapuntará a diferentes instancias.
Como resultado, los símbolos se usan a menudo como el equivalente de las enumeraciones en Ruby, así como las claves de un diccionario (hash).
Solo para presionar el punto de @ mipadi, cuando compara una cadena, necesita comparar cada personaje entre sí. Entonces, comparar cadenas idénticas es O (n). Mientras que los símbolos rubí comparan referencias de objetos, la bruja es O (1).
Jeremy Heiler, el
¿Por qué Python no tiene esto?
Trabajo
Usted debe tener cuidado de no uso excesivo de ellos también, ya que, la última sabía, pero no he estudiado esto en ruby> 1.9, los símbolos no se les gc'd y así pueden comer hasta la memoria
frogstarr78
Se comportan de manera idéntica en Smalltalk, excepto que se ven así #mySymbol.
Frank Shearar
@ frogstarr78 - A menos que esté generando símbolos mediante programación (intercalando cadenas sin verificarlas primero), no tiene que preocuparse por crear demasiados símbolos.
Justin L.
16
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
Mejor explicación que la mayoría que he visto hasta ahora.
Yuri Ghensev
0
Por lo general, las variables tienden a confundirse con las cadenas, pero puedo entender que pienses que es una variable. Es entendible. Piénsalo 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:unsurey :dead. Para verificar si un jugador está vivo, en lugar de hacer esto:
Respuestas:
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 tienes
:my_str
Sólo se creará una vez, yx
yy
apuntan a la misma área de memoria. Por otro lado, si tienesuna cadena que contiene
my_str
se creará dos veces , yx
yy
apuntará a diferentes instancias.Como resultado, los símbolos se usan a menudo como el equivalente de las enumeraciones en Ruby, así como las claves de un diccionario (hash).
fuente
#mySymbol
.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
También puede ver el símbolo como enumeración instantánea. No necesita definir un símbolo, solo lo usa. Este artículo lo explica con gran detalle.
fuente
Por lo general, las variables tienden a confundirse con las cadenas, pero puedo entender que pienses que es una variable. Es entendible. Piénsalo 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 verificar si un jugador está vivo, en lugar de hacer esto:if player_status == 1
Podrías hacer esto:
if player_status == :alive
fuente