But du symbole de Scala? [dupliquer]

possibilité de dupliquer:

Quels sont quelques exemples d'utilisation cas pour symboles littéraux en Scala?

Quel est le but du symbole et pourquoi mérite-t-il quelque spécial littéral syntaxe E. G. 'FooSymbol ?

49
demandé sur Community 2010-08-24 11:37:23

3 réponses

Les symboles

sont utilisés lorsque vous avez un ensemble fermé d'identificateurs que vous voulez pouvoir comparer rapidement. Lorsque vous avez deux instances String , elles ne sont pas garanties d'être internées[1], donc pour les comparer vous devez souvent vérifier leur contenu en comparant les longueurs et même en vérifiant caractère par caractère si elles sont identiques. Avec les instances Symbol , les comparaisons sont une simple vérification eq (i.e. == en Java), donc elles sont temps constant(i.e. O (1)) à regardez vers le haut.

ce type de structure tend à être utilisé davantage dans les langages dynamiques (notamment le code Ruby et Lisp tend à faire beaucoup d'utilisation de symboles) car dans les langages statiquement typés on veut généralement restreindre l'ensemble des éléments par type.

ayant dit que, si vous avez un magasin de clé/valeur où il y a un ensemble restreint de clés, où il va être difficile d'utiliser un objet statique dactylographié, une structure Map[Symbol, Data] - style pourrait bien être bon pour vous.

Une note sur la String en stage sur l'île de Java (et donc de la Scala) : Java String s sont internés dans certains cas, de toute façon; en particulier, les littéraux de chaîne sont automatiquement internés, et vous pouvez appeler la intern() une méthode String exemple de retour d'un interné copie. Tous les String s ne sont pas internés, cependant, ce qui signifie que le runtime doit encore faire la vérification complète à moins qu'ils ne soient la même instance; interning fait comparer deux chaînes internes égales plus rapidement, mais n'améliore pas la durée d'exécution de comparer des chaînes différentes. Symbol s avantage d'être garanti à interner, de sorte que dans ce cas, un seul contrôle d'égalité de référence est à la fois suffisant pour prouver l'égalité ou l'inégalité.

[1] Interning est un processus par lequel lorsque vous créez un objet, vous vérifiez si un objet égal existe déjà, et utilisez celui-ci s'il existe. Cela signifie que si vous avez deux les objets qui sont égaux, ils sont exactement le même objet (c'est-à-dire qu'ils sont égaux de référence). Les inconvénients sont qu'il peut être coûteux de chercher quel objet vous devez utiliser, et permettre aux objets d'être des déchets collectés peut nécessiter une mise en œuvre complexe.

85
répondu Calum 2016-10-24 19:22:21

Symbol sont internés.

le but est que Symbol sont plus efficaces que String s et Symbol s avec le même nom sont référencés au même objet Symbol (donc ayant le même hashcode).

lisez à propos des symboles de rubis: http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols

Vous ne pouvez obtenir le nom d'un Symbol :

scala> val aSymbol = 'thisIsASymbol
aSymbol: Symbol = 'thisIsASymbol

scala> assert("thisIsASymbol" == aSymbol.name)
6
répondu michael.kebe 2010-08-24 07:55:50

ce N'est pas très utile en Scala et donc peu utilisé. En général, vous pouvez utiliser un symbole pour désigner un identificateur.

par exemple, la fonctionnalité d'invocation par réflexion qui était prévue pour 2.8.0 utilisait la syntaxe obj o 'method(arg1, arg2) où " o "était une méthode ajoutée à N'importe laquelle et le symbole a été ajouté la méthode apply(Any*) (les deux avec "pimp my library").

un autre exemple pourrait être si vous voulez créer un moyen plus facile de créer HTML documents, puis au lieu d'utiliser "div" pour désigner un élément que vous écririez "div". Alors on peut imaginer ajouter des opérateurs au symbole pour faire du sucre syntaxique pour créer des éléments

5
répondu IttayD 2010-08-24 08:52:42