Perché la corrispondenza degli schemi in Scala non funziona con le variabili?

Assumi la seguente funzione:

def fMatch(s: String) = { s match { case "a" => println("It was a") case _ => println("It was something else") } } 

Questo schema si adatta bene:

 scala> fMatch("a") It was a scala> fMatch("b") It was something else 

Quello che vorrei essere in grado di fare è il seguente:

 def mMatch(s: String) = { val target: String = "a" s match { case target => println("It was" + target) case _ => println("It was something else") } } 

Questo emette il seguente errore:

 fMatch: (s: String)Unit :12: error: unreachable code case _ => println("It was something else") 

Immagino che questo sia perché pensa che il bersaglio sia in realtà un nome che vorresti assegnare a qualunque sia l’input. Due domande:

  1. Perché questo comportamento? Non è ansible che il caso cerchi solo le variabili esistenti nello scope che hanno il tipo appropriato e le usano prima e, se non ne viene trovato nessuno, quindi considerano il target come un nome da attribuire a patternmatch?

  2. C’è una soluzione per questo? Qualche modo per modellare la corrispondenza con le variabili? Alla fine si potrebbe usare una dichiarazione big if, ma match case è più elegante.