web-dev-qa-db-fra.com

Quels sont les exemples d'utilisation des littéraux de symboles dans Scala?

L'utilisation des littéraux de symboles ne ressort pas immédiatement de ce que j'ai lu sur Scala. Quelqu'un voudrait-il partager certaines utilisations du monde réel?

Existe-t-il un Java couvert par des littéraux de symboles? Quels langages ont des constructions similaires? Je viens d'un arrière-plan Python et je ne suis pas sûr qu'il y ait quelque chose d'analogue) dans cette langue.

Qu'est-ce qui me motiverait à utiliser "HelloWorld vs" HelloWorld "?

Merci

91
Joe Holloway

En Java, les symboles sont des chaînes internes. Cela signifie, par exemple, que la comparaison d'égalité de référence (eq in Scala et == en Java) donne le même résultat que la comparaison d'égalité normale (== in Scala et equals en Java): 'abcd eq 'abcd renverra true, tandis que "abcd" eq "abcd" pourrait ne pas l'être, selon les caprices de la JVM (enfin, il devrait l'être pour les littéraux, mais pas pour les chaînes créées dynamiquement en général).

Les autres langues 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 lorsque je ne me soucierais pas de la structure d'une chaîne et l'utiliserais uniquement comme 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 "prix", peu m'importe que le deuxième caractère de "prix" soit "r", ou sur la concaténation des noms de colonnes; donc une bibliothèque de base de données en Scala pourrait raisonnablement utiliser des symboles pour les noms de table et de colonne.

75
Alexey Romanov

Si vous avez des chaînes simples représentant des noms de méthode dans le code, qui peuvent être transmises, vous ne transmettez pas tout à fait correctement. Il s'agit en quelque sorte du problème de limite de données/code, il n'est pas toujours facile de tracer la ligne, mais si nous devions dire que dans cet exemple, ces noms de méthode sont plus de code que de données, nous voulons que quelque chose l'identifie clairement. .

Un littéral de symboles entre en jeu où il différencie clairement toutes les anciennes données de chaîne avec une construction utilisée dans le code. C'est juste vraiment là où vous voulez indiquer, ce ne sont pas seulement des données de chaîne, mais en fait en quelque sorte une partie du code. L'idée étant des choses comme votre IDE le mettrait en évidence différemment, et étant donné l'outillage, vous pourriez refactoriser ces éléments, plutôt que de faire de la recherche/remplacement de texte.

Ce lien en parle assez bien.

25
Saem

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 fonction intern (sys.intern en python3).

En outre, Java et Scala utilise automatiquement "chaînes internes" pour des recherches plus rapides. Avec scala, vous pouvez utiliser le 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 d'être garantis d'être internés, donc une seule vérification d'égalité de référence est à la fois suffisante pour prouver l'égalité ou l'inégalité.

2
ChemaCortes