98 votes

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

L'utilisation des symboles littéraux n'est pas immédiatement claire d'après ce que j'ai lu sur Scala. Quelqu'un pourrait-il me faire part de quelques utilisations réelles ?

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

Qu'est-ce qui me pousserait à utiliser "HelloWorld" plutôt que "HelloWorld" ?

Merci

79voto

Alexey Romanov Points 39124

En termes de Java, les symboles sont des chaînes de caractères internées. Cela signifie, par exemple, que la comparaison de l'égalité des références ( 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 vrai, tandis que "abcd" eq "abcd" pourrait ne pas l'être, selon les caprices de la JVM (en fait, elle devrait l'être pour les littéraux, mais pas pour les chaînes de caractères créées dynamiquement en général).

Les autres langages qui utilisent des symboles sont Lisp (qui utilise 'abcd comme Scala), Ruby ( :abcd ), Erlang et Prolog ( abcd ; on les appelle des atomes au lieu de symboles).

J'utiliserais un symbole lorsque je ne me soucie pas de la structure d'une chaîne de caractères et que je l'utilise uniquement pour nommer 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", je ne me soucie pas que le deuxième caractère de "prix" soit "r", ni de la concaténation des noms de colonnes ; une bibliothèque de base de données en Scala pourrait donc raisonnablement utiliser des symboles pour les noms de tables et de colonnes.

26 votes

Il est bon de rappeler que == en Scala fait la même chose que .equals, donc la différence se situe au niveau de l'utilisation de la méthode "eq" qui fait l'égalité de référence. Un avantage, cependant, est que la comparaison entre les symboles est extrêmement bon marché.

0 votes

@Calum, tout comme la comparaison entre deux chaînes de caractères. Java internalise (plus ou moins) toutes les chaînes de caractères.

4 votes

@Elazar : C'est vraiment vrai ? J'avais l'impression que Java n'internait que les littéraux (c'est-à-dire presque toutes les chaînes de caractères dans les exemples triviaux, et presque aucune chaîne de caractères 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 sans doute le principal avantage que vous obtenez est juste un type plus descriptif.

26voto

Saem Points 2415

Si vous avez des chaînes simples représentant, par exemple, des noms de méthodes dans le code, qui peuvent être transmises, vous ne transmettez pas les choses de manière appropriée. C'est en quelque sorte la question de la frontière entre les données et le code, il n'est pas toujours facile de tracer la ligne, mais si nous devions dire que dans cet exemple, ces noms de méthodes sont plus du code que des données, alors nous voulons quelque chose pour l'identifier clairement.

Un symbole littéral entre en jeu lorsqu'il différencie clairement une simple chaîne de données d'une construction utilisée dans le code. C'est là que vous voulez indiquer qu'il ne s'agit pas d'une simple donnée de type chaîne de caractères, mais qu'elle fait en quelque sorte partie du code. L'idée est que des choses comme votre IDE le mettraient en évidence différemment, et compte tenu de l'outillage, vous pourriez remanier sur ces éléments, plutôt que de faire une recherche/remplacement de texte.

Este lien en parle assez bien.

2 votes

Cette explication est très utile. Elle me fait penser à des alternatives aux enums, qui peuvent être maladroits.

4voto

jmcejuela Points 811

Note : Symbols sera déprécié puis supprimé dans Scala 3 (dotty).

Référence : http://dotty.epfl.ch/docs/reference/dropped-features/symlits.html

Pour cette raison, je recommande personnellement de ne pas utiliser Symbols plus (du moins dans le nouveau code scala). Comme l'indique la documentation de Dotty :

Les littéraux de symboles ne sont plus supportés

il est recommandé d'utiliser une chaîne littérale simple [...] à la place.

3voto

ChemaCortes Points 121

Python maintient une table globale interne de "chaînes internées" avec les noms de toutes les variables, fonctions, modules, etc. Grâce à cette table, l'interpréteur peut effectuer des recherches et des optimisations plus rapides. Vous pouvez forcer ce processus avec l'option intern fonction ( sys.intern dans python3).

En outre, Java et Scala utilisent automatiquement "chaînes internées" pour des recherches plus rapides. Avec scala, vous pouvez utiliser le intern pour forcer l'interne d'une chaîne de caractères, mais ce procédé ne fonctionne pas avec toutes les chaînes de caractères. Les symboles bénéficient de la garantie d'être internés, donc une seule vérification de l'égalité des références est suffisante pour prouver l'égalité ou l'inégalité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X