Quels sont quelques exemples de cas d'utilisation pour les littéraux de symboles dans Scala?

93

L'utilisation de littéraux de symboles n'est pas immédiatement claire d'après ce que j'ai lu sur Scala. Quelqu'un voudrait-il partager des utilisations du monde réel?

Existe-t-il un idiome Java particulier couvert par des symboles littéraux? Quels langages ont des constructions similaires? Je viens d'un fond Python et je ne suis pas sûr qu'il y ait quelque chose d'analogue dans ce langage.

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

Merci

Joe Holloway
la source

Réponses:

76

En termes Java, les symboles sont des chaînes internes. Cela signifie, par exemple, que la comparaison d'égalité de référence ( eqen Scala et ==en Java) donne le même résultat que la comparaison d'égalité normale ( ==en Scala et equalsen Java): 'abcd eq 'abcdretournera 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 'abcdcomme 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.

Alexey Romanov
la source
25
Il vaut probablement la peine de se rappeler que == dans Scala fait la chose .equals, donc vraiment la différence serait lors de l'utilisation de la méthode "eq" qui fait référence à l'égalité. Un bonus, cependant, est que la comparaison entre les symboles est extrêmement bon marché.
Calum
@Calum, tout comme la comparaison entre deux chaînes. Stagiaires Java (plus ou moins) toutes les chaînes.
Elazar Leibovich
4
@Elazar: Est-ce vraiment vrai? J'avais l'impression que Java n'internait que des littéraux (c'est-à-dire presque toutes les chaînes dans des exemples triviaux, et presque pas de chaînes dans les logiciels de production). Cela dit, les cas d'utilisation des symboles sont généralement des valeurs littérales (je doute que vous les construisiez souvent à partir de zéro), donc on peut soutenir que le principal avantage que vous obtenez est simplement un type plus descriptif.
Calum
1
@Elazar Ils ne le sont pas, car les symboles peuvent compter sur leur valeur en cours d'internement, alors qu'avec Strings, c'est facultatif et peut optimiser certains cas d'utilisation. Les symboles sont plus comme des Enums créés dynamiquement qu'autre chose. J'ai développé cela sur la réponse que j'ai liée dans ma dernière réponse; veuillez le lire pour en savoir plus.
Calum
3
Alors, "bonjour, monde!" est une collection séquentielle de personnages tandis que «helloWorld est une valeur amicale pour les gens plutôt que 14392.
CW Holeman II
26

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.

Saem
la source
1
Ceci est une explication utile. Cela me fait réfléchir en termes d'alternatives aux énumérations - ce qui peut être maladroit
javadba
2

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 internfonction ( sys.internen python3).

De plus, Java et Scala utilisent automatiquement des «chaînes internes» pour des recherches plus rapides. Avec scala, vous pouvez utiliser la internmé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é.

ChemaCortes
la source