9
scala> class A 
defined class A 

scala> class B 
defined class B 

scala> val a: A = new A 
a: A = [email protected] 

scala> a match { 
    | case _: B => println("unlikely") 
    | case _ => println("no match") 
    | } 
no match 

Yukarıdaki örnekte, derleyici bana durumlardan birinin eşleşemeyeceğini söylememeli mi? Biraz daha karmaşık bir örnek yakın zamanda derleyici tarafından yakalanmış olması gereken gereksiz bir böcek gibi ne hissetti yol beni yakaladı.Scala'da daha iyi yazım denetimi

Düzenleme:

Sadece soru hakkında net olması. Scala'da bu imkansız mı? (Türlerin jenerik kullanıp kullanmadığını ve türün silinmesi sorunlara yol açıp açmadığını anlayabiliyorum, ancak bu oldukça ileriye doğru görünüyor.) Ve bu imkansız değilse, bu Scala'da geçerli olmayan meşru nedenler var mı? Değilse ne zaman eklenecek? ;)

cevap

22

Halen tüm ayrıntıları ve fazlalık sadece vaka sınıf yapıcı kalıpları için yapılır Kontrolden. Prensip olarak, derleyici bunu başka modellerde de yapabilirdi. Ancak SLS'de tam olarak hangi testlerin yapıldığı belirtilmelidir. Bu, farklı desen sınıflar arasındaki etkileşimler göz önüne alındığında, yapılabilir ancak önemsiz olmayan görünüyor. Dolayısıyla, özetle, Scala'daki diğer katkılardan faydalanacak alanlardan biri.

+3

İnanılmaz! Bana scala teached ve de bunu indvented birinden Cevabımı gidin! Thx stackoverflow! – Kami

4

derleyici Eğer durum sınıfları kullanırsanız (aslında derleme olarak) başarısız uyarmak yapar:

scala> case class A() 
defined class A 

scala> case class B() 
defined class B 

scala> val a = A() 
a: A = A() 

scala> a match { 
    | case A() => println("A") 
    | case B() => println("B") 
    | case _ => println("_") 
    | } 
<console>:13: error: constructor cannot be instantiated to expected type; 
found : B 
required: A 
     case B() => println("B") 
+0

Maalesef durum sınıfları bazı kısıtlamaları vardır ve her zaman uygun değildir. Derleyicinin neden normal sınıflar için bunu anlayamadığını da göremiyorum. – Dave

İlgili konular