En termes Java, les symboles sont des chaînes internes. Cela signifie, par exemple, que la comparaison d'égalité de référence ( eq
en Scala et ==
en Java) donne le même résultat que la comparaison d'égalité normale ( ==
en Scala et equals
en Java): 'abcd eq 'abcd
retournera true, alors que "abcd" eq "abcd"
ce ne sera peut-être pas le cas, selon les caprices de JVM (enfin, il devrait pour les littéraux, mais pas pour les chaînes créées dynamiquement en général).
D'autres langages qui utilisent des symboles sont Lisp (qui utilise 'abcd
comme Scala), Ruby ( :abcd
), Erlang et Prolog ( abcd
; ils sont appelés atomes au lieu de symboles).
J'utiliserais un symbole quand je ne me soucierais pas de la structure d'une chaîne et l'utiliser uniquement comme un nom pour quelque chose. Par exemple, si j'ai une table de base de données représentant des CD, qui comprend une colonne nommée «price», je me fiche que le deuxième caractère de «price» soit «r» ou de concaténation des noms de colonnes; donc une bibliothèque de base de données dans Scala pourrait raisonnablement utiliser des symboles pour les noms de table et de colonne.
Si vous avez des chaînes simples représentant des noms de méthodes dans le code, qui peuvent être transmises, vous ne communiquez pas tout à fait les choses de manière appropriée. C'est en quelque sorte le problème de la limite Data / Code, il n'est pas toujours facile de tracer la ligne, mais si nous disions que dans cet exemple, ces noms de méthodes sont plus du code que des données, alors nous voulons quelque chose pour identifier clairement cela .
Un Symbol Literal entre en jeu où il différencie clairement n'importe quelle ancienne chaîne de données avec une construction utilisée dans le code. C'est juste vraiment là où vous voulez indiquer, ce n'est pas seulement des données de chaîne, mais en fait une partie du code. L'idée étant des choses comme votre IDE le mettrait en évidence différemment, et étant donné les outils, vous pourriez refactoriser sur ceux-ci, plutôt que de faire une recherche / remplacement de texte.
Ce lien en parle assez bien.
la source
Python conserve une table globale interne de "chaînes internes" avec les noms de toutes les variables, fonctions, modules, etc. Avec cette table, l'interpréteur peut effectuer des recherches et des optimisations plus rapides. Vous pouvez forcer ce processus avec la
intern
fonction (sys.intern
en python3).De plus, Java et Scala utilisent automatiquement des «chaînes internes» pour des recherches plus rapides. Avec scala, vous pouvez utiliser la
intern
méthode pour forcer l'interne d'une chaîne, mais ce processus ne fonctionne pas avec toutes les chaînes. Les symboles bénéficient de la garantie d'être internés, de sorte qu'un seul contrôle d'égalité de référence suffit à la fois pour prouver l'égalité ou l'inégalité.la source