2011-12-21 1 views
15

Dans Scala 2.9.1 je reçois le comportement suivant:Scala: ordre de définition pour objet compagnon vs classe affaire

class Foo { 
    case class X() 
    object X   // this compiles 

    def bar() { 
     object Y   // this compiles 
     case class Y() 

     case class Z() 
     object Z   // won't compile (see below) 
    } 
} 

Le compilateur se plaint pour Object Z: erreur: Z est déjà définie comme (compilateur généré) objet compagnon de classe case Z

Il semble qu'il ne soit pas permis de définir un objet compagnon pour une classe de cas après la définition de classe de cas si elles se trouvent dans une définition de fonction. Est-ce un bug du compilateur, ou intentionnel? Si ce dernier, pourquoi?

Répondre

12

Ceci est un bug connu: SI-3772: companions and method-owned case classes. Ceci est partiellement fixé, mais le problème de l'OP reste toujours. Votez si vous le voulez.

+0

Il est assez facile de contourner le problème, donc je ne suis pas sûr que cela vaille la peine de voter. Merci pour le lien vers le ticket. –

1

La raison pour laquelle la première est autorisée et la seconde ne l'est pas est que les classes et les objets peuvent avoir des définitions directes, mais pas les définitions. Alors pourquoi il est possible que le compilateur mélange object X avec celui défini par la classe case, il n'est pas possible de le faire dans le second cas.

Je me demande ce qui se passe dans le cas Y: l'observation ou le compagnon d'objet n'est pas généré du tout?

+0

Attends, quoi? :-) Voulez-vous dire "les classes et les objets peuvent avoir des définitions en avant, mais les ** méthodes ** ne peuvent pas"? –

+1

@GregorScheidt Ni méthodes ni fonctions. Eh bien, Scala Spec ne sait pas ce qu'est une "méthode", donc je pourrais aussi bien les appeler des fonctions, mais je déteste le nom de confusion autour de "fonction". –

Questions connexes