2013-08-09 18 views
5

Łańcuchy Wyrażenia dopasowania nie są kompilowane.Dlaczego kombinacja wyrażeń dopasowywania nie kompiluje się?

val x = Array("abc", "pqr") 

x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
} match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

Choć dodaje kompiluje grzywny:

(x match { 
    case Array("abc", _*) => Some("abc is first") 
    case Array("xyz", _*) => Some("xyz is first") 
    case _ => None 
}) match { 
    case Some(x) => x 
    case _ => "Either empty or incorrect first entry" 
} 

Dlaczego nowszej (gdzie pierwszy mecz jest wyrażenie w nawiasach) skompilować porządku podczas wcześniej nie?

+3

Nie ma nic do powiedzenia tutaj wyjątkiem 'match' nie jest metoda, ale słowo kluczowe i kompilator działają w ten sposób. – senia

+0

@senia Zawsze można coś powiedzieć. Oczywiście nie zawsze oryginalne lub interesujące. –

+0

@senia Jeśli już zostało udzielone, to nie będę miał odpowiedzi. –

Odpowiedz

1

Gdyby pozwolono, nie można zrobić:

scala> List(1,2,3) last match { case 3 => true } 
warning: there were 1 feature warning(s); re-run with -feature for details 
res6: Boolean = true 

Oznacza to, że gdyby była notacja infiksowa, wówczas rzeczą w lewo nie może być postfix.

Niedozwolone dopasowanie infiksów zezwala na postfiksową weryfikację.

To wyrażenie jest analizowany w sposób naturalny

(List(1,2,3) last) match { case 3 => true } 

To znaczy, jeśli zapis postfix jest naturalny i nie bezbożny.

Ostrzeżenie funkcji dotyczy import language.postfixOps. Być może po wyłączeniu tej funkcji obrońcy dobra będą chętni do rozrywki import language.infixMatch.

Rozważmy konstrukcje składniowe, które są do match rodzeństwo, które nie są infixable bez parens:

scala> if (true) 1 else 2 match { case 1 => false } 
res4: AnyVal = 1 // not false 

scala> (if (true) 1 else 2) match { case 1 => false } 
res1: Boolean = false 

lub

scala> throw new IllegalStateException match { case e => "ok" } 
<console>:11: error: type mismatch; // not "ok", or rather, Nothing 
found : String("ok") 
required: Throwable 
       throw new IllegalStateException match { case e => "ok" } 
                   ^

scala> (throw new IllegalStateException) match { case e => "ok" } 
java.lang.IllegalStateException 
Powiązane problemy