288 votes

Qu'est-ce que l'opérateur deux-points en Ruby ?

Quand je dis { :bla => 1, :bloop => 2 } que fait exactement le : faire ? J'ai lu quelque part que c'était similaire à une chaîne de caractères, mais en quelque sorte un symbole.

Je ne suis pas très clair sur le concept, quelqu'un pourrait-il m'éclairer ?

1 votes

Duplicata possible de Comprendre les symboles en Ruby

7 votes

Essayez de regarder ça : Le guide Ruby_Nouveau venu des symboles

0 votes

Cette vidéo vous dit tout ce que vous devez savoir sur les symboles.

301voto

Chris Jester-Young Points 102876

:foo est un symbole nommé "foo". Les symboles ont la particularité que deux symboles portant le même nom seront identiques :

"foo".equal? "foo"  # false
:foo.equal? :foo    # true

Cela permet de comparer deux symboles très rapidement (puisque seule une comparaison de pointeur est impliquée, par opposition à la comparaison de tous les caractères comme vous le feriez dans une chaîne), et vous n'aurez pas un million de copies du même symbole flottant autour de vous.

En outre, contrairement aux chaînes de caractères, les symboles sont immuables.

3 votes

Je me demande juste pourquoi la chaîne littérale ne supporte pas l'internalisation des chaînes de caractères ?

6 votes

@onmyway133 Parce que les chaînes de Ruby sont mutables. L'internage ne s'applique qu'aux valeurs immuables.

4 votes

A) Pourquoi "foo".equal? "foo" faux ? b) Peut-on faire référence à un symbole n'importe où, ce qui en fait des variables globales ?

60voto

the Tin Man Points 69148

Juste pour démontrer certaines des choses mentionnées dans les réponses :

require 'benchmark'

n = 1_000_000

print '"foo".equal? "foo" -> ', ("foo".equal? "foo"), "\n"
print '"foo" == "foo"     -> ', ("foo" == "foo"    ), "\n"
print ':foo.equal? :foo   -> ', (:foo.equal? :foo  ), "\n"
print ':foo == :foo       -> ', (:foo == :foo      ), "\n"

Benchmark.bm(10) do |b|
  b.report('string')     { n.times { "foo".equal? "foo" }}
  b.report('str == str') { n.times { "foo" == "foo"     }}
  b.report('symbol')     { n.times { :foo.equal? :foo   }}
  b.report('sym == sym') { n.times { :foo == :foo       }}
end

L'exécution des sorties :

"foo".equal? "foo" -> false
"foo" == "foo"     -> true
:foo.equal? :foo   -> true
:foo == :foo       -> true

Ainsi, la comparaison d'une chaîne de caractères à une chaîne de caractères en utilisant equal? échoue parce que ce sont des objets différents, même si leur contenu est égal. == compare le contenu, et les contrôles équivalents avec des symboles sont beaucoup plus rapides.

                 user     system      total        real
string       0.370000   0.000000   0.370000 (  0.371700)
str == str   0.330000   0.000000   0.330000 (  0.326368)
symbol       0.170000   0.000000   0.170000 (  0.174641)
sym == sym   0.180000   0.000000   0.180000 (  0.179374)

Les deux tests de symboles sont fondamentalement les mêmes en termes de vitesse. Après 1 000 000 d'itérations, il n'y a que 0,004733 seconde de différence, donc je dirais qu'il faut choisir lequel utiliser.

0 votes

Extrêmement utile ! Sur mon système, == a été plus rapide que .equal? pour les comparaisons de chaînes et de symboles. Les comparaisons de symboles sont 3+ fois plus rapides que les comparaisons de chaînes de caractères.

34voto

nunopolonia Points 5218

Les symboles sont une façon de représenter les chaînes de caractères et les noms en ruby.

La principale différence entre les symboles et les chaînes de caractères est que les symboles de même nom sont initialisés et n'existent en mémoire qu'une seule fois pendant une session de ruby.

Ils sont utiles lorsque vous devez utiliser le même mot pour représenter différentes choses.

25voto

Scott Points 81

Voici quelques citations du célèbre livre Développement Web agile avec Rails qui peuvent être utiles pour comprendre le symbole ainsi que :

Rails utilise des symboles pour identifier les choses. En particulier, il les utilise comme clés pour nommer les paramètres des méthodes et rechercher des éléments dans les hachages.

redirect_to :action => "edit", :id => params[:id]

Vous pouvez considérer les symboles comme des chaînes de caractères qui sont magiquement transformées en constantes. Vous pouvez également considérer que les deux points signifient "la chose nommée", ainsi :id est "la chose nommée id".

0voto

kindall Points 60645

C'est un symbole. En gros, vous dites que les deux éléments du hash ont des clés bla et bloop comme si vous aviez utilisé les cordes. "bla" et "bloop" . Cependant, ils occupent moins de mémoire que les chaînes de caractères et sont plus faciles à taper.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X