it-swarm.dev

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

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 symboles et variables? Pourquoi ne pas simplement utiliser des variables?

Merci.

49
wassimans

Les variables et les symboles sont des choses différentes. Une variable pointe vers différents types de données. En Ruby, un symbole ressemble plus à une chaîne qu'à une variable.

En Ruby, une chaîne est mutable, tandis 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_str ne sera créé qu'une seule fois et x et y pointera vers la même zone de mémoire. D'un autre côté, si vous avez

x = "my_str"
y = "my_str"

une chaîne contenant my_str sera créé deux fois, et x et y pointera vers différentes instances.

Par conséquent, les symboles sont souvent utilisés comme équivalents aux énumérations dans Ruby, ainsi que les clés d'un dictionnaire (hachage).

74
mipadi

Symbole dans 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 une sorte d'état, par exemple

order.status = :canceled
order.status = :confirmed

Vous pouvez également regarder le symbole comme une énumération instantanée. Vous n'avez pas besoin de définir un symbole, vous l'utilisez simplement. Cet article l'explique en détail.

18
Jakub Arnold

Habituellement, les variables ont tendance à être confondues avec des chaînes, mais je peux comprendre que vous le pensiez comme une variable. C'est compréhensible. Pense-y de cette façon:

Le statut d'un joueur dans un jeu est représenté par un nombre. 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 vivant, au lieu de faire ceci:

if player_status == 1

Vous pouvez faire ceci:

if player_status == :alive

1
sirsnow