Qu'est-ce qu'un symbole en Ruby?

45

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?

Merci.

Wassimans
la source
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).

Mipadi
la source
1
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.

Jakub Arnold
la source
1
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:

if player_status == 1

Vous pourriez faire ceci:

if player_status == :alive

sirsnow
la source