2012-10-29 19 views
23

Scala Numaralandırmanın güvenli olmadığına dair bir dizi onay gördüm. Nasıl güvenli yazılmaz? Açık bir şekilde, güvenli bir şekilde, bir Numaralamanın bir değerinin farklı bir Numaralandırmaya geçemeyeceği şekilde görünür.Scala: Numaralandırma nasıl güvenli yazılmaz?

Numaralama ile önlemek için tuzaklar veya şeyler nelerdir?

cevap

33

Bu yarı güvenlidir. Bu güvenli tip bir derleyici kurgu, bu yüzden kırılması kolaydır. Örneğin, erkekler kızlar değiller.

Şimdi numaralandırma ile deneyelim:

object Test extends Enumeration { val One, Two = Value } 
object Probar extends Enumeration { val Uno, Dos = Value } 
def h(tv: Test.Value) = tv.toString 

scala> h((Probar.Uno).asInstanceOf[Test.Value]) 
res0: java.lang.String = Uno 

Bekle, ne?

def h(pv: Probar.Value) = pv.toString // Add this to the other h in a :paste 

method h:(pv: Probar.Value)java.lang.String and 
method h:(tv: Test.Value)java.lang.String at line 9 
have same type after erasure: (pv: Enumeration#Value)java.lang.String 
      def h(pv: Probar.Value) = pv.toString 

Ah, tamam, teşekkürler:

Bu kurgu

diğer garip davranışlara yol açar? derleyici gerçekten kendi yapı olarak Enumeration anlamıyor çünkü

Ve sonra, beklediğinizden şekilde size yardım edemez:

scala> def oops(tv: Test.Value) = tv match { case Test.One => "okay" } 
oops: (tv: Test.Value)java.lang.String 
// No incomplete match warning? Okay.... 

scala> oops(Test.Two) 
scala.MatchError: Two (of class scala.Enumeration$Val) 
    at .oops(<console>:8) 
    ... 

tam olarak nispeten sınırlı şekillerde kullanabilirsiniz Yani eğer amaçlandığı gibi, tip güvenliği sağlar. Ancak, diğer modellerin gücü ve sağlamlığı yok, bunun gibi:

// In REPL, :paste the next three lines 
sealed trait Foo 
object Bar extends Foo 
object Baz extends Foo 

scala> def safe(f: Foo) = f match { case Bar => "okay" } 
<console>:9: warning: match is not exhaustive! 
missing combination   Baz 

     def safe(f: Foo) = f match { case Bar => "okay" } 
         ^

Teşekkürler, derleyici!

İlgili konular