2010-07-08 8 views
18
scala> class A(implicit a: Int); 
defined class A 

scala> class B()(implicit a: Int); 
defined class B 

scala> new A()(1) 
res1: A = [email protected] 

scala> new B()(1) 
res2: B = [email protected] 

scala> new A(1) 
<console>:7: error: too many arguments for constructor A:()(implicit a: Int)A 
     new A(1) 

Dlaczego Scalac wstawia pustą listę parametrów przed niejawną listą parametrów podaną w deklaracji klasy?Dlaczego pierwsza lista parametrów klasy nie może być niejawna?

To wydaje się być cechą, a nie błąd, sądząc po commentary in the scalac sources:

// konwersji (niejawny ...) do () (niejawny ...), jeżeli jego jedynym parametr sekcja

Jestem ciekawy, dlaczego tak się dzieje. Uważam, że jest to dość zaskakujące.

Odpowiedz

7

Sposób, w jaki widzę, to to, że lista niejawnych parametrów nie zastępuje zwykłej listy (ów). Ponieważ dla definicji konstruktorów potrzebna jest co najmniej jedna lista parametrów, jeśli nic nie jest wyraźnie wskazane, generowane jest "()".

Chociaż może to być rzeczywiście zagadkowe, jest to zgodne z generowaniem pustego konstruktora, gdy nie ma żadnych list parametrów.

5

Dobra, z pomocą @ venechki answer, myślę, że to wymyśliłem.

Przy zwykłych klasach, Scala wnioskuje i pusta lista parametrów, albo w deklaracji klasy (class B) lub w punkcie klasy instancji (new A i new B):

scala> class A() 
defined class A 

scala> new A 
res19: A = [email protected] 

scala> new A() 
res20: A = [email protected] 

scala> class B 
defined class B 

scala> new B 
res21: B = [email protected] 

scala> new B() 
res22: B = [email protected] 

Tak aby być w zgodzie z ta zasada określa pustą listę parametrów przed niejawną listą parametrów (class D(implicit ...)).

scala> class C()(implicit a: Int = 0) 
defined class C 

scala> new C 
res23: C = [email protected] 

scala> new C() 
res24: C = [email protected] 

scala> new C()(0) 
res25: C = [email protected] 

scala> class D(implicit a: Int = 0) 
defined class D 

scala> new D 
res26: D = [email protected] 

scala> new D() 
res27: D = [email protected] 

scala> new D()(0) 
res28: D = [email protected]