Je suis totalement nouveau dans le monde Ruby et je suis un peu confus avec le concept de symboles. Quelle est la différence entre les symboles et les variables? Pourquoi ne pas simplement utiliser des variables?
dans Lisp - dont Ruby est dérivé - un symbole est essentiellement le type de données d'une variable; cela signifie que vous pouvez manipuler le programme de la même manière que Reflection pendant son exécution. (pas l'explication la plus cohérente, désolé)
Paul Nathan
Réponses:
71
Les variables et les symboles sont des choses différentes. Une variable pointe sur différents types de données. En Ruby, un symbole ressemble plus à une chaîne qu'une variable.
En Ruby, une chaîne est modifiable, alors qu'un symbole est immuable. Cela signifie qu'une seule copie d'un symbole doit être créée. Ainsi, si vous avez
x =:my_str
y =:my_str
:my_strne sera créé qu'une seule fois xet ypointe vers la même zone de mémoire. D'autre part, si vous avez
x ="my_str"
y ="my_str"
une chaîne contenant my_strsera créé deux fois , et xet ypointera vers différentes instances.
En conséquence, les symboles sont souvent utilisés comme l’équivalent d’énums en Ruby, ainsi que les clés d’un dictionnaire (hash).
Juste pour appuyer le point @ mipadi, lorsque vous comparez une chaîne, vous devez comparer chaque caractère les uns par rapport aux autres. Donc, comparer des chaînes identiques est O (n). Tandis que les symboles ruby comparent les références d'objet dont le symbole est O (1).
Jeremy Heiler
Pourquoi Python n'a-t-il pas cela?
Job
Vous devriez faire attention à ne pas en abuser aussi, car, la dernière fois que je le savais, je n'ai pas examiné cela dans ruby> 1.9, les symboles ne sont pas gc'd et peuvent donc dévorer la mémoire
frogstarr78
Ils se comportent de la même manière en Smalltalk, sauf qu’ils se ressemblent #mySymbol.
Frank Shearar
@ frogstarr78 - Sauf si vous générez des symboles par programme (interner des chaînes sans les vérifier au préalable), vous n'avez pas à vous soucier de créer trop de symboles.
Justin L.
17
Le symbole en Ruby est fondamentalement la même chose que le symbole dans le monde réel. Il est utilisé pour représenter ou nommer quelque chose.
Les symboles sont très couramment utilisés pour représenter un type d'état, par exemple
order.status =:canceled
order.status =:confirmed
Vous pouvez également regarder le symbole comme enum instantané. Vous n'avez pas besoin de définir un symbole, vous l'utilisez simplement. Cet article l'explique en détail.
Meilleure explication que beaucoup d’autres me semblent jusqu’à présent.
Yuri Ghensev
0
Habituellement, les variables ont tendance à être confondues avec des chaînes, mais je peux comprendre que vous pensiez qu'il s'agissait d'une variable. C'est compréhensible. Pense-y de cette façon:
Le statut d'un joueur dans une partie est représenté par un numéro. 1 signifie vivant, 2 signifie incertain, 3 signifie mort. Cela peut facilement être remplacé par des symboles. Les symboles pourraient être :alive:unsureet :dead. Pour vérifier si un joueur est en vie, au lieu de faire ceci:
Réponses:
Les variables et les symboles sont des choses différentes. Une variable pointe sur différents types de données. En Ruby, un symbole ressemble plus à une chaîne qu'une variable.
En Ruby, une chaîne est modifiable, alors qu'un symbole est immuable. Cela signifie qu'une seule copie d'un symbole doit être créée. Ainsi, si vous avez
:my_str
ne sera créé qu'une seule foisx
ety
pointe vers la même zone de mémoire. D'autre part, si vous avezune chaîne contenant
my_str
sera créé deux fois , etx
ety
pointera vers différentes instances.En conséquence, les symboles sont souvent utilisés comme l’équivalent d’énums en Ruby, ainsi que les clés d’un dictionnaire (hash).
la source
#mySymbol
.Le symbole en Ruby est fondamentalement la même chose que le symbole dans le monde réel. Il est utilisé pour représenter ou nommer quelque chose.
Les symboles sont très couramment utilisés pour représenter un type d'état, par exemple
Vous pouvez également regarder le symbole comme enum instantané. Vous n'avez pas besoin de définir un symbole, vous l'utilisez simplement. Cet article l'explique en détail.
la source
Habituellement, les variables ont tendance à être confondues avec des chaînes, mais je peux comprendre que vous pensiez qu'il s'agissait d'une variable. C'est compréhensible. Pense-y de cette façon:
Le statut d'un joueur dans une partie est représenté par un numéro. 1 signifie vivant, 2 signifie incertain, 3 signifie mort. Cela peut facilement être remplacé par des symboles. Les symboles pourraient être
:alive
:unsure
et:dead
. Pour vérifier si un joueur est en vie, au lieu de faire ceci:if player_status == 1
Vous pourriez faire ceci:
if player_status == :alive
la source