10

Pourquoi toutes les classes Scala héritent de ScalaObject bien que ce trait soit complètement vide et n'ait aucune fonctionnalité (visible?) Par rapport à AnyRef, qui définit des méthodes supplémentaires?Pourquoi `ScalaObject` existe-t-il?

Ne qui appelle la méthode ralentir comme equals() ou hashCode() parce qu'il devra prendre une autre classe en considération (qui pourrait remplacer les méthodes)?

N'est-il pas possible de replier AnyRef et ScalaObject dans une classe?

MISE À JOUR: ScalaObject was eradicated avec une nouvelle version de 2.10 Scala.

Répondre

11

ScalaObject insère un procédé $tag, qui, d'après le commentaire dans le library source code for 2.7 « est nécessaire pour l'optimisation des expressions d'appariement de formes qui correspondent à des constructeurs de classes de cas. » Puisque le nom commence par $, il devrait bien sûr être considéré comme "caché" aux programmeurs d'applications. Dans Scala 2.8, il est entièrement vide, donc je suppose qu'il est là pour la rétrocompatibilité.

+0

Pourquoi cette méthode $ tag n'est-elle pas insérée dans AnyRef? – soc

+0

Compat arrière, je suppose. (J'ai prolongé ma réponse après avoir téléchargé et lu le code source 2.8.) –

+0

J'ai parcouru le code du compilateur et il y a du code pour le gérer d'une manière spéciale (fichier 'Global.scala'), mais aucune explication pourquoi c'est là. –

4

Il fait également un crochet pratique pour les analyses statiques. Imaginons par exemple que vous disposiez d'un outil capable de rechercher dans une base de code (compilée ou non) et que vous puissiez améliorer la métrique de la cohésion/couplage/équilibre des couches/what-have-you en extrayant un trait de ces classes et créer des conversions implicites pour ces classes. Cet outil ne devrait raisonnablement rapporter que des traits qui pourraient être extraits de manière profitable des classes qui héritent de ScalaObject, tout en rapportant des conversions implicites rentables de n'importe quelle classe Java. Le même outil rendrait compte des éventuels retours "NULL" des sous-classes ScalaObject (où Option ou similaire est généralement un meilleur choix), tout en ignorant les retours NULL des classes Java.

7

La répartition des méthodes n'enchaîne pas la structure d'héritage de classe recherchant des implémentations. Le compilateur construit une table d'affectation de méthode nette pour chaque classe qui reflète sa lignée de substitution/héritée. C'est l'une des vertus de la résolution statique de tous les types de frappe.