Quelle est la différence entre une chaîne et un symbole en Ruby et quand devriez-vous utiliser l'un sur l'autre?
La principale différence est que plusieurs symboles représentant une seule valeur sont identiques, alors que ce n'est pas le cas avec des chaînes. Par exemple:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3 références au symbole: test, tout le même objet.
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3 références à la chaîne "test", tous les objets différents.
Cela signifie que l'utilisation de symboles peut potentiellement économiser une bonne quantité de mémoire en fonction de l'application. Il est également plus rapide de comparer les symboles d’égalité, car il s’agit du même objet. La comparaison de chaînes identiques est beaucoup plus lente, car les valeurs de chaîne doivent être comparées au lieu des identificateurs d’objet.
En ce qui concerne le moment où utiliser lequel, j’utilise habituellement des chaînes pour presque tout sauf des choses comme les clés de hachage où je veux vraiment un identifiant unique, pas une chaîne.
Quelles sont les différences entre Symbols & Strings?
From Comprendre les différences entre les symboles et les chaînes en Ruby
Si vous êtes chinois, vous pouvez également lire Symbol Ruby Symbol
La déclaration
foo = "bar"
crée un nouvel objet en mémoire. Si on répète la déclaration
foo = "bar"
Nous créons un autre objet
pour l'obtenir plus clairement s'il vous plaît essayez le code ci-dessous sur la console Ruby
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
vous obtiendrez une sortie comme
string bar with object id = 70358547221180
string bar with object id = 70358548927060
qui montre clairement qu'il existe deux objets différents pour la même chaîne. Maintenant, si vous utilisez symbol, cela créera un objet par symbole so
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
spectacles
symbol bar with object id = 7523228
symbol bar with object id = 7523228
ce qui signifie qu'il n'y a qu'un seul objet pour: bar
les autres symboles sont immuable et vous ne pouvez appeler aucune des méthodes String telles que #upcase, #split
sur les symboles.
La comparaison des symboles est plus rapide que la comparaison des chaînes.
Les symboles peuvent être considérés comme des chaînes constantes/immuables qui forment un ensemble unique qui est effectivement converti en pointeurs de mémoire sur le tas. Cela signifie que la comparaison de deux symboles est rapide car vous comparez simplement 2 entiers (pointeurs de mémoire).
Les chaînes sont modifiables afin que le pointeur de mémoire sur leur valeur sur le tas puisse changer après la modification. Cela signifie que les opérations de comparaison sont plus lentes car il peut exister des doublons sémantiquement équivalents.
Les usages
utilisez Symbol
lorsque vous êtes sûr que la valeur restera constante. Exemple d'utilisation des symboles pour les clés de hachage, Utilise une chaîne lorsque vous souhaitez modifier la valeur ou si vous souhaitez utiliser la méthode chaîne.
Cas où le symbole peut être un désastre. Disons que vous avez params.map(&:to_sym)
dans votre contrôleur Rails. Maintenant, si vous convertissez les données fournies par l'utilisateur en symboles pour une raison quelconque, cela pourrait être dangereux. Si les données fournies par l'utilisateur sont trop volumineuses et que nous savons que ce symbole n'est pas un ramasse-miettes, vous pourriez épuiser la mémoire de votre serveur, ce qui risquerait de détruire votre site Web.
Les chaînes sont mutables, les symboles sont immuables
Remarque: les objets mutables peuvent être modifiés après l'affectation, tandis que les objets immuables ne peuvent être remplacés que par http://www.robertsosinski.com/2009/01/11/the -difference-entre-Ruby-symboles-et-chaînes/
Un symbole est quelque chose que vous utilisez pour représenter des noms et des chaînes. Vous voudrez peut-être utiliser un symbole lorsque vous devrez peut-être utiliser une chaîne plusieurs fois, ce qui est beaucoup plus facile et plus productif.
Et vient de le trouver via google, qui peut offrir plus de détails: Voilà
Il existe deux différences principales entre String et Symbol dans Ruby.
La chaîne est modifiable et le symbole n'est pas
Parce que la chaîne est modifiable, il peut être modifié quelque part et peut conduire à un résultat incorrect.
Le symbole est immuable.
String est un objet, il a donc besoin d'une allocation de mémoire.
met "abc" .object_id # 70322858612020
met "abc" .object_id # 70322846847380
met "abc" .object_id # 70322846815460
Dans l’autre main, Symbol aura le même objet:
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
puts :abc.object_id # 1147868
Donc, la chaîne prendra plus de temps à utiliser et à comparer que Symbol.
Vous pouvez en lire plus ici pour bien comprendre:
le symbole est immuable et la chaîne est mutable.
lorsque nous effectuons une opération sur une chaîne, il crée un nouvel objet et utilise de la mémoire. À mesure que nous effectuons de plus en plus d'opérations sur des chaînes, nous consommons de plus en plus de mémoire.
symbole est un objet qui est immuable signifie que si nous effectuons une opération, il effectue les modifications dans l’objet original. Il ne créera aucun objet, c’est pourquoi il est plus rentable.
pour plus d'informations, vous pouvez cliquez ici
Les symboles et les chaînes de caractères sont complètement différents cet article a un petit aperçu des différences. Pour ce qui est de savoir quand et où les utiliser, il existe un article assez complet sur ce sujet, sur a beaucoup: à travers .
En contrepoint, un de mes amis a récemment écrit un article intitulé "Ruby Rant" qui donne un autre regard sur les symboles de Ruby.