web-dev-qa-db-fra.com

Quelle est la différence entre une chaîne et un symbole en Ruby?

Quelle est la différence entre une chaîne et un symbole en Ruby et quand devriez-vous utiliser l'un sur l'autre?

56
Readonly

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.

72
Robert Gamble

Quelles sont les différences entre Symbols & Strings? 

  1. Les symboles sont immuables: leur valeur reste constante.
  2. Plusieurs utilisations du même symbole ont le même ID d'objet et sont le même objet par rapport à string qui sera un objet différent avec un ID d'objet unique, à chaque fois.
  3. Vous ne pouvez appeler aucune des méthodes String telles que #split on Symbols.

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

10
Feuda

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.

5
Nitin9791

Une différence supplémentaire entre String et Symbol est qu'un String a beaucoup plus de méthodes pour la manipulation de chaînes, alors qu'un Symbol est un objet relativement maigre.

Consultez la documentation de la classe String et de la classe Symbol .

3
Grant Hutchins

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.

1
Chimed Palden

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/

1
Nitesh

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à

1
websch01ar

Il existe deux différences principales entre String et Symbol dans Ruby.

  1. 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.

  2. 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: 

1
Leo Le

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

0
user3423263

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 .

0
Codebeef

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.

0
Greg Hewgill