Le Guide Ruby_Newbie des symboles

Note: Tous les matériaux de Ruby Revival sont fournis tels. En lisant les matériaux de Ruby Revival, vous acceptez d'assumer tous les risques liés à l'utilisation des matériaux, et vous acceptez d'absoudre les auteurs, les propriétaires et toute autre personne intervenant avec Ruby Revival de toute responsabilité quant à l'issue de toute utilisation ces matières, même dans le cas d'erreurs et / ou omissions dans les matériaux. Si vous n'êtes pas d'accord, vous ne devez pas lire ces documents.

Pour 99,9% d'entre vous honnêtes lecteurs qui prennent la responsabilité de vos propres actions, je suis vraiment désolé, il est nécessaire de soumettre tous les lecteurs à l'avertissement ci-dessus.
CONTENU

véritables vétérans Ruby comprennent des symboles de manière intuitive, donc ils ne ont pas besoin de cette documentation. En effet, un vétéran de Ruby pourrait regarder la documentation que vous êtes en train de lire et l'appeler inexact, parce que les concepts présentés dans cette documentation ne correspondent pas à la mise en œuvre réelle des symboles Ruby. Ce document ne prétend pas expliquer la mise en œuvre des symboles Ruby, mais explique plutôt comment un programmeur d'application peut penser à eux et de les utiliser pour atteindre les résultats escomptés, ainsi que de lire des symboles contenant du code.

Les symboles peuvent être consultés sur plusieurs niveaux:
  • Qu'est-ce que les symboles ressemblent?
  • Que font-ils ressemblent dans d'autres langues?
  • Comment les symboles mis en œuvre?
  • Quels sont les symboles?
  • Quels sont les symboles non?
  • Qu'est-ce que les symboles peuvent faire pour vous?
  • Quels sont les avantages des symboles?
Certains d'entre dans ce document, les niveaux sont expliqués, et plusieurs ne sont pas nécessaires pour corriger l'utilisation de symboles. Continuer à lire.

Ceci est une zone où tout le monde est d'accord. La plupart des symboles ressemble à deux points suivi d'une chaîne non citée:
Une autre façon de faire un symbole avec deux points suivi d'une chaîne entre guillemets, ce qui est la façon dont vous faites un symbole dont la représentation chaîne contient des espaces:
Ce qui précède est également un symbole. Sa représentation de chaîne est:


Lorsque vous utilisez des citations dans un symbole, vous pouvez utiliser seul ou doublequotes, tant que le début et de fin sont des citations du même type. Simples ou doubles, les représentations chaîne et numériques sont identiques, et object_id est le même.

Les symboles sont immuables. Leur valeur reste constante pendant toute la durée du programme. Ils apparaissent jamais sur le côté gauche d'une affectation. Vous ne verrez jamais ceci:
Si vous deviez essayer, vous obtiendrez le message d'erreur suivant:


Les symboles sont utilisés comme ceci:
Ou ca:
Ou ca:
Ou ca:
Maintenant, vous savez au moins ce que nous parlons. Bien sûr, vous avez encore beaucoup de questions. Continuer à lire.

Je ne suis pas qualifié pour répondre à cette question. À long terme, il n'a pas d'importance. Essayer de répondre à cette question au début de votre carrière Ruby peut embrouiller la question.

La seule réponse vraiment autorité à cette question est de lire le code C à partir de laquelle Ruby (en fait le fichier exécutable Ruby) est construit. Toutefois, si vous êtes nouveau à Ruby, ou une personne qui utilise Ruby parce qu'il aime mais n'a pas besoin d'être une autorité avant tout Ruby, c'est une réponse que vous n'avez pas besoin à ce moment, et il est probablement préférable pour la moment d'ignorer toutes les discussions sur la façon dont les symboles sont mis en œuvre en Ruby.

C'est une chaîne. Non, c'est un objet. Non, c'est un nom.

Il y a des éléments de vérité dans chacune des affirmations précédentes, et pourtant, à mon avis, ils ne sont pas utiles, en partie parce qu'ils dépendent d'une profonde connaissance de Ruby pour comprendre leur signification. Je préfère répondre à la question « quels sont les symboles » dans une langue de manière indépendante:

Un symbole Ruby est une chose qui a à la fois un nombre (entier) et la représentation d'une représentation de chaîne.


Dans sa mise en œuvre réelle Ruby, le symbole ne contient pas une chaîne ou un numéro - la chaîne et le numéro sont conservés quelque part ailleurs. Ce n'est pas important pour comprendre comment cela fonctionne, cependant, donc ne hésitez pas à penser le symbole comme contenant la chaîne et le numéro si c'est plus facile à visualiser. Dans votre code, vous pouvez obtenir la représentation numérique avec la syntaxe: mysymbol.to_i, et la représentation de la chaîne avec: mysymbol.to_s syntaxe. Dans la plupart des cas, un symbole donne la représentation de chaîne, même sans la conversion de to_s.

La représentation de chaîne du nombre est beaucoup plus important que la partie du numéro. En fait, la partie du numéro est rarement utilisé.

Explorons plus loin en utilisant le code suivant:


Le code précédent affiche quatre lignes. La première ligne affiche la représentation de chaîne parce que c'est la façon dont la méthode puts () est mis en place. La deuxième ligne est une conversion explicite à la chaîne. Le troisième est une conversion explicite en entier. Le quatrième imprime le type du symbole. Les résultats de code précédent dans la sortie suivante:


La première ligne indique la représentation de chaîne du symbole. Notez que la représentation de chaîne est identique à la chaîne suivante du côlon. La deuxième ligne convertit d'abord le symbole d'un objet de chaîne en utilisant to_s. puis imprime. La sortie est le même, mais la conversion explicite à l'objet chaîne offre quelques fonctionnalités supplémentaires que vous pourriez (ou non) ont besoin. Ceci est discuté plus loin dans ce document.

La troisième ligne représente la représentation entière du symbole. Il est un nombre non utile non significatif et à peu près qui ne peut pas être changé. La quatrième ligne montre que le symbole est un objet de la classe Symbol.

Maintenant, nous allons explorer un code qui prouve que la valeur du symbole ne peut pas être modifié lors de l'exécution:


Ne peut pas StrongARM l'entier. Bien sûr, to_i et to_a ont jamais été destinés à être mis en méthodes - ils sont des méthodes obtenir (en fait, ils sont les conversions, mais vous ne devez pas considérer que ce moment), mais il est assez évident qu'un symbole ne peut pas être modifié lors de l'exécution . En parler de l'informatique, il est immuable.

Un dernier point. Dans un seul programme, toutes les occurrences d'un symbole identique est en fait le nom même objet. Ce n'est pas vrai de chaînes. Regarde ça:


Comme vous pouvez le voir, les deux fois: myvalue a été utilisé, il avait le même ID d'objet. Comme vous pouvez le voir, les ID d'objet de deux utilisations de « myvalue » ont produit deux ID d'objet différents. Voici comment les symboles peuvent économiser de la mémoire.

Sur la base de ce qui a été présenté dans cette section, nous pouvons ajouter à la langue réponse indépendante à la question « qu'est-ce qu'un symbole »:
  • Un symbole Ruby est une chose qui a à la fois un nombre (entier) et la représentation d'une représentation de chaîne.
  • La représentation de chaîne est beaucoup plus important et beaucoup plus souvent utilisés.
  • La valeur d'une part de la chaîne de symbole Ruby est le nom du symbole, moins le côlon principal.
  • Un symbole Ruby ne peut pas être modifié lors de l'exécution.
  • utilisations multiples du même symbole ont le même ID d'objet et sont le même objet.
Maintenant, nous allons injecter un peu de terminologie spécifique Ruby. Presque tout dans Ruby est un objet, et les symboles ne font pas exception. Ils sont des objets.

Un symbole est pas une chaîne

Un symbole Ruby est pas une chaîne. objets chaîne Ruby ont des méthodes telles que tirer. et le centre. symboles Ruby ont pas ces méthodes:

Un symbole est pas (seulement) un nom

Cependant, les symboles peuvent être utilisés pour contenir toute sorte de chaîne immuable. Il pourrait être utilisé comme une constante (mais vous auriez probablement utiliser un identifiant commençant par une lettre majuscule au lieu. Le point est, les symboles ne se limitent pas à de simples noms.

Cela étant dit, les symboles sont utilisés comme noms assez souvent, donc bien un symbole assimilant à un nom n'est pas correct, symboles disant sont souvent utilisés pour contenir des noms est une affirmation raisonnable.

Un symbole est un objet, mais quoi?

Pas de doute, un symbole est un objet, mais quoi. Presque tout dans Ruby est un objet, alors dire un symbole est un objet dit rien distinctif sur les symboles.

Un symbole est un moyen de transmettre des informations de la chaîne, en supposant toujours que:
  1. La chaîne n'a pas besoin d'être modifiée lors de l'exécution.
  2. La chaîne n'a pas besoin de méthodes de classe String.
Parce qu'un symbole peut être converti en une chaîne avec la méthode .to_s, vous pouvez créer une chaîne avec la même valeur que la représentation de la chaîne du symbole, et vous pouvez changer cette chaîne à volonté et utiliser toutes les méthodes de cordes.

Pour voir, de manière simplifiée, comment attr_writer fait sa « magie », consultez ce programme:


Dans la précédente, la fonction make_me_a_setter est une version très simplifiée de attr_writer. Il ne met pas en œuvre le signe égal, donc d'utiliser le setter, vous devez mettre l'argument entre parenthèses au lieu de après un signe égal. Il n'itérer pas par de multiples arguments, de sorte que chaque make_me_a_setter peut prendre un seul argument, qui est la raison pour laquelle nous l'appelons individuellement pour les deux: symboll et « stringg ».

Avec les poseurs faits, le programmeur d'application peut accéder aux poseurs comme example.symboll ( « ITS UN SYMBOLE »). Ce qui suit est la sortie du programme:

Si vous avez besoin d'une « chaîne » (terme utilisé vaguement) qui ne doit pas être changé, alors vous avez besoin d'un symbole, parce que la valeur d'un symbole ne peut pas être modifié lors de l'exécution.

Les symboles ont généralement des avantages de performance. Chaque symbole est identifié au programmeur par son nom (par exemple. MySymbol), mais le programme peut l'identifier par sa représentation numérique, ce qui est bien sûr une recherche plus rapide.

Lorsque deux chaînes sont comparées, quelque part dans certains pointeurs de la couche d'abstraction doit marcher deux cordes, à la recherche d'un décalage. Lorsque deux symboles Ruby sont comparés, si leur représentation numérique est égale, les symboles sont égaux. Si vous deviez utiliser: MySymbol vingt fois dans votre programme, chaque utilisation de: MySymbol se réfère à exactement le même objet avec exactement la même représentation numérique et exactement la même représentation de chaîne. Cela peut améliorer les performances.

Parce que chaque: MySymbol fait référence à un seul objet et encore « définit » (J'utilise le terme vaguement) une chaîne littérale, il économise de la mémoire considérable sur l'aide d'une chaîne littérale à chaque fois, parce que chaque vraie chaîne littérale consomme de la mémoire, alors qu'une fois un symbole défini, usages supplémentaires consomment pas de mémoire supplémentaire. Donc, si vous utilisez les mêmes dizaines de chaînes littérales ou des centaines de fois, des symboles de substitution. clés hash sont un excellent exemple.

L'ancêtre de tous les avantages est aussi le grand-papa des avantages: les symboles ne peuvent pas être modifiés lors de l'exécution. Si vous avez besoin de quelque chose qui est absolument, positivement doit rester constante, et pourtant vous ne voulez pas utiliser un identifiant commençant par une lettre majuscule (une constante), alors les symboles sont ce dont vous avez besoin.

Le grand avantage des symboles est qu'ils sont immuables (ne peut pas être modifié lors de l'exécution), et parfois c'est exactement ce que vous voulez.

Parfois, c'est exactement ce que vous ne voulez pas. La plupart utilisation des chaînes nécessite une manipulation - quelque chose que vous ne pouvez pas faire (au moins directement) avec des symboles.

Un autre inconvénient des symboles est qu'ils ne sont pas riche ensemble de méthodes d'instance de la classe String. La méthode d'instance de classe String rendent la vie plus facile. Beaucoup plus facile.

Peu importe ce que leur compréhension des symboles, les anciens combattants Ruby savent comment les utiliser pour obtenir les résultats souhaités. Le problème est, Ruby newbies ne savent pas comment utiliser des symboles pour obtenir les résultats souhaités, mais ils doivent écouter et essayer d'apprendre des explications souvent contradictoires de vétérans Ruby. vétérans Ruby fondent souvent leurs explications sur Ruby coutumes spécifiques, des riffs ou même implémentations internes, distançant davantage leurs explications du débutant Ruby.

Ce document est destiné spécifiquement au débutant Ruby. Il utilise très peu de mise en œuvre spécifique Ruby dans son explication des symboles. Il ne discute pas finesses, mais donne lieu les informations que le débutant a vraiment besoin de savoir afin d'utiliser des symboles pour atteindre ses objectifs de codage, ainsi que pour lire des symboles contenant du code.

Les énoncés suivants sont à portée de main dans l'utilisation des symboles (ou de ne pas utiliser):
  • Un symbole Ruby ressemble à un colon suivi de caractères. (: MySymbol)
  • Un symbole Ruby est une chose qui a à la fois un nombre (entier) et une chaîne.
  • La valeur d'une part de la chaîne de symbole Ruby est le nom du symbole, moins le côlon principal.
  • Un symbole Ruby ne peut pas être modifié lors de l'exécution.
  • Ni la représentation de chaîne ni sa représentation entier peuvent être modifiés lors de l'exécution.
  • symboles Ruby sont utiles dans la prévention de la modification.
  • Comme la plupart des autres choses dans Ruby, un symbole est un objet.
  • Lors de la conception d'un programme, vous pouvez généralement utiliser une chaîne au lieu d'un symbole.
    • Sauf lorsque vous devez garantir que la chaîne ne soit pas modifiée.
  • objets symboles ne sont pas le riche ensemble de méthodes d'instance que les objets font cordes.
  • Après la première utilisation de: MySymbol tous les autres useages de: MySymbol ne pas prendre plus de mémoire - ils sont tous le même objet.
  • symboles Ruby économiser de la mémoire sur un grand nombre de chaînes littérales identiques.
  • symboles Ruby améliorent la vitesse d'exécution d'au moins un certain degré.

Articles Liés