Qu'est-ce que le côlon opérateur en Ruby?
Quand je dis { :bla => 1, :bloop => 2 }
, exactement ce que fait le :
faire? J'ai lu quelque part sur la façon dont il est semblable à une chaîne de caractères, mais en quelque sorte un symbole.
Je ne suis pas super clair sur le concept, quelqu'un pourrait-il m'éclairer?
- double possible de la Compréhension des Symboles Dans Ruby
- Essayez de regarder ceci: Le Ruby_Newbie Guide des Symboles
- Cette vidéo vous dit tout ce que vous devez savoir sur les symboles.
Vous devez vous connecter pour publier un commentaire.
:foo
est un symbole nommé "toto". Les symboles ont la particularité que les deux symboles avec le même nom sera identique:Ce qui rend la comparaison de deux symboles très vite (depuis seulement un pointeur de comparaison est en cause, plutôt que de comparer tous les caractères comme vous le feriez dans une chaîne de caractères), de plus, vous n'aurez pas un tas de copies de la même symbole flottant sur.
Aussi, à la différence des chaînes de caractères, des symboles sont immuables.
"foo".equal? "foo"
faux? b) Pouvez-vous vous référer à un symbole de n'importe où, essentiellement comme des variables globales?equal?
en Ruby ne l'identité de comparaison. Chaque chaîne de caractères littérale, comme"foo"
, crée une nouvelle instance de chaîne. Il fonctionne de cette façon parce que les chaînes en Ruby sont mutables. 2. Les symboles sont globaux, mais plus comme des constantes globales que des variables globales, puisque les symboles n'ont pas d'état. Ainsi, à l'aide de symboles n'est pas un antipattern dans la façon dont les variables globales sont.Juste pour démontrer certaines des choses mentionnées dans les réponses:
L'exécutant sorties:
Ainsi, la comparaison d'une chaîne de caractères d'une chaîne à l'aide de
equal?
échoue parce qu'ils sont des objets différents, même si elles sont égales contenu.==
compare le contenu, et l'équivalent des contrôles avec les symboles sont beaucoup plus rapides.À la fois symbole de tests sont fondamentalement les mêmes que la mesure de la vitesse. Après 1 000 000 d'itérations il n'y a qu'0.004733 deuxième différence, donc je dirais que c'est un laver les, entre lesquels utiliser.
==
a entraîné plus vite que.equal?
pour à la fois la chaîne et le symbole des comparaisons. Symbole de comparaison débouche 3 fois plus rapide que les comparaisons de chaînes.Symboles sont un moyen de représenter des chaînes de caractères et les noms en ruby.
La principale différence entre les symboles et les chaînes, c'est que les symboles du même nom sont initialisés et d'exister dans la mémoire qu'une seule fois au cours d'une session de ruby.
Ils sont utiles lorsque vous avez besoin d'utiliser le même mot pour représenter différentes choses
Il y a quelques citations du célèbre livre Agile de Développement Web avec des Rails, qui peut être utile pour comprendre la symbole ainsi :
En ruby chaque objet a un identificateur d'objet unique, si vous écrivez
puts "hello".object_id
dans votre cisr et appuyez sur return pour 2 moments différents, vous obtiendrez 2 le retour de la valeur,mais si vous écrivez:hello.object_id
2 fois, vous ne obtenir la même valeur de retour.Qui aurait expliqué la différence.
Si vous utilisez
:foo => bar
, foo sera un symbole. L'avantage de symboles, c'est qu'ils sont uniques. Lorsque vous appelez sur un élément dans la table de hachage, vous nehash[:foo]
.Symboles nécessitent moins de mémoire que les chaînes, ce qui les rend également utile si vous voulez faire de votre programme un peu plus vite.
C'est un symbole. En gros, vous dites que les deux éléments de la table de hachage ont des touches
bla
etbloop
, un peu comme si vous aviez utilisé les cordes"bla"
et"bloop"
. Cependant, ils prennent moins de mémoire que les chaînes et sont plus facile à taper.Toutes ces réponses omettre un seul détail alléchant.. si vous stringify le symbole :foo, vous obtenez.. devinez quoi ... la chaîne "toto". Donc
Donc.. pour les programmeurs Perl.. c'est le Rubis, la réponse à la "bare-parole".
Si vous êtes familier avec Java, vous pourriez être conscient que les Chaînes de caractères en Java sont immuables. Les symboles sont similaires en ce sens en Ruby. Ils sont immuables, c'est à dire, n'importe quel nombre d'événements d'un symbole particulier
:symbol
correspond à une seule adresse de mémoire. Et, par conséquent, il est recommandé d'utiliser des symboles dans la mesure du possible, car il optimise l'utilisation de la mémoire.NSString
. Il y"foo"
sera toujours égal à"foo"
, car en interne des chaînes de caractères qui sont les mêmes sont juste fait. La réponse devrait toujours être déroutant, mais.