2012-04-08 13 views
6

'da garip bir davranış sergiliyor Bu kod parçasında neler olduğunu anlamaya çalışıyorum, anlamadığım bir şey olup olmadığını veya bir derleyici olup olmadığını anlamaya çalışıyorum hata veya unintuitive spec, bu iki hemen hemen aynı işlevleri tanımlayalım:Sent sıralayıcıyla eşleşen yazılan eşleşmeler Scala

def typeErause1(a: Any) = a match { 
    case x: List[String] => "stringlists" 
    case _ => "uh?" 
} 
def typeErause2(a: Any) = a match { 
    case List(_, _) => "2lists" 
    case x: List[String] => "stringlists" 
    case _ => "uh?" 
} 

şimdi typeErause1(List(2,5,6)) çağırırsanız o farkı anlatmak mümkün değildir tip silme ile aslında List[Int] olsa bile çünkü "stringlists" olsun. Ancak garip bir şekilde typeErause2(List(2,5,6))'u çağırırsam "uh?" elde ederim ve neden daha önce olduğu gibi List[String] ile uyuşmadığını anlamıyorum. İkinci işlev yerine List[_] kullanırsam, doğru bir şekilde eşleştirebilir ve bu da bana scalacda bir hata olduğunu düşünür. ? Ben Scala 2.9.1 Bu Eşleştirici bir hata var

+2

Bu eşleştiricide bir hata var - bununla ilgili çok sayıda bilet var ve Scala 2.10.x ile başlamalıdır. –

+0

Biletle bir bağlantınız var, bu yüzden cevap olarak sizi seçebilir miyim? – ilcavero

+1

Dediğim gibi, maççıyla ilgili çok fazla bilet var ve bu özel davayı kapsayanlar için özellikle avlanma konusunda özellikle ilgilenmiyorum. –

cevap

1

kullanıyorum

; 2.10

için) desen eşleştirme aracı (varlık olmuştur edilir) rewritten Sadece gece son ve senin ile kontrol Kod beklendiği gibi çalışır:

Welcome to Scala version 2.10.0-20120426-131046-b1aaf74775 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> def typeErause1(a: Any) = a match { 
    |  case x: List[String] => "stringlists" 
    |  case _ => "uh?" 
    | } 
warning: there were 2 unchecked warnings; re-run with -unchecked for details 
typeErause1: (a: Any)String 

scala> def typeErause2(a: Any) = a match { 
    |  case List(_, _) => "2lists" 
    |  case x: List[String] => "stringlists" 
    |  case _ => "uh?" 
    | } 
warning: there were 3 unchecked warnings; re-run with -unchecked for details 
typeErause2: (a: Any)String 

scala> typeErause1(List(2,5,6)) 
res0: String = stringlists 

scala> typeErause2(List(2,5,6)) 
res1: String = stringlists