2011-12-21 13 views
15

W Scala 2.9.1 pojawia się następujący problem:Scala: kolejność definicji obiektu towarzyszącego vs klasy case

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) 
    } 
} 

Kompilator narzeka na Object Z: błąd: Z jest już zdefiniowany jako (kompilator generowane) obiekt towarzyszący klasa obiekt Z

Wygląda na to, że nie można zdefiniować obiektu towarzyszącego dla klasy sprawy po definicji klasy sprawy, jeśli znajdują się one w definicji funkcji. Czy jest to błąd kompilatora, czy zamierzony? Jeśli to drugie, dlaczego?

Odpowiedz

12

Jest to znany błąd: SI-3772: companions and method-owned case classes. Jest to częściowo ustalone, ale problem PO pozostaje w dalszym ciągu. Głosuj, jeśli chcesz to naprawić.

+0

Łatwo jest pracować, więc nie jestem pewien, czy warto głosować. Dzięki za link do biletu. –

1

Powodem, dla którego pierwszy jest dozwolony, a drugi nie jest, jest to, że klasy i obiekty mogą mieć definicje forward, ale definicje nie mogą. Dlaczego więc kompilator może mieszać object X z tym zdefiniowanym przez klasę case, nie można tego zrobić w drugim przypadku.

Zastanawiam się, co dzieje się w przypadku Y: shadowing lub obiekt towarzysza nie są generowane w ogóle?

+0

Czekaj, co? :-) Czy miałeś na myśli "klasy i obiekty mogą mieć definicje forward, ale ** metody ** nie mogą"? –

+1

@GregorScheidt Ani metody, ani funkcje. No cóż, Scala Spec nie wie, co to jest "metoda", więc równie dobrze mogę nazwać je funkcjami, ale nienawidzę wymowy nazwy wokół "funkcji". –

Powiązane problemy