2013-04-23 7 views
6

Kompilator scala powinien generować ostrzeżenia dla instrukcji if, które skomentowałem poniżej, ale tak się nie dzieje. Czemu?Dlaczego kompilator scala nie generuje ostrzeżenia w przypadku instrukcji, które zawsze powodują fałsz w dopasowaniu wzorca?

sealed trait T 
object A extends T 

val s:Seq[T] = Seq(A) 

val result = s.map { 
    //This if should produce a compiler warning 
    case a if(a == "A") => 
     "First" 
    case a => 
     //This if should produce a compiler warning 
     if (a == "A") { 
     "Second" 
     } 
     else 
     { 
     "Third" 
     } 
} 

Rezultatem będzie „trzecie”, jak można się spodziewać, ale kompilator powinien generowane ostrzeżenie na case a if(a == "A") i na if (a == "A"), ale niestety nie ma ostrzeżenia.

Jeśli piszę następujący kod zachowuje się jak bym się spodziewał:

if(A == "A"){ 
    println("can't happen") 
} 

// warning: comparing values of types A.type and String using `==' will always yield false 

Dlaczego tak się dzieje?

Edytuj: Używam Scala 2.10.1.

+0

Wierzę, że podczas korzystania z pasujące do wzorca, trzeba określić typ dla każdego przypadku, w przeciwnym razie będzie pasowała do niczego. Spróbuj zmienić na "case a: A if (a ==" A ") => ...". – Felix

+0

Próbowałem go z 'case a: T if (a ==" A ") =>' i nadal bez ostrzeżenia. – coltfred

Odpowiedz

1

Ponieważ może się zdarzyć. Gdybym po prostu zachował jakiś stan wewnętrzny i zwrócił różne wyniki dla == "A" przy pierwszym i drugim wywołaniu, wtedy mogę uzyskać "Drugi".

Podałeś definicję A, która gwarantuje, że nie może się zdarzyć, ale to wymaga zbadania całego programu, a ostrzeżenia kompilatora są tylko lokalne.

+1

Nie jestem pewien, czy rozumiem twoją odpowiedź. Jeśli napiszę wyrażenie 'if (A ==" a ") {}' gdziekolwiek w moim kodzie, otrzymam ostrzeżenie kompilatora, ale mówisz, że jakoś dopasowanie wzorca sprawia, że ​​lokalizacja deklaracji ma znaczenie? Proszę o wyjaśnienie. – coltfred

0

Może trzeba będzie dziedziczona z klasy metody przeciążonej == z argumencie ...

+0

To prawda, ale kompilator zna te informacje. Omówiłem to z Joshem Suerethem, który pracuje w systemie typesafe, a jego odpowiedź brzmiała następująco: "Kompilator nie generujący ostrzeżenia nie jest błędem, ale chcemy, aby ostrzeżenie było bardziej niezawodne". Tak więc, chociaż nie jest to "błąd", nie jest zaimplementowany. – coltfred

+0

Mam nadzieję, że będziemy mogli zobaczyć to ostrzeżenie w przyszłych wersjach kompilatora Scala :) – aeracode

Powiązane problemy