Execute a seguinte função:
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
Este padrão combina perfeitamente:
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
O que eu gostaria de poder fazer é o seguinte:
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
Isso dá o seguinte erro:
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
Acho que é porque ele pensa que o destino é na verdade um nome que você gostaria de atribuir a qualquer que seja a entrada. Duas questões:
Por que esse comportamento? Não é possível apenas procurar variáveis existentes no escopo que tenham o tipo apropriado e usá-las primeiro e, se nenhuma for encontrada, tratar o alvo como um nome para o padrão de correspondência?
Existe uma solução alternativa para isso? Alguma maneira de combinar padrões com variáveis? No final das contas, pode-se usar uma instrução if grande, mas a caixa de correspondência é mais elegante.
scala
pattern-matching
match
Henry Henrinson
fonte
fonte
Respostas:
O que você está procurando é um identificador estável . No Scala, eles devem começar com uma letra maiúscula ou estar entre crases.
Ambos seriam soluções para o seu problema:
Para evitar a referência acidental a variáveis que já existiam no escopo delimitador, acho que faz sentido que o comportamento padrão seja que os padrões em minúsculas sejam variáveis e não identificadores estáveis. Somente quando você vê algo começando com maiúsculas, ou em marcações anteriores, você precisa estar ciente de que vem do escopo circundante.
fonte
target
é um valor (val
) e não uma variável (var
). Não funciona com variáveis.Nil
, que eu aposto que é o verdadeiro motivo.this
como um identificador estável para combinar padrões contra ele, a única maneira parece ser usar uma proteção de igualdade comocase x if x == this =>
. Provavelmente uma limitação sintática, caso contrário, deve funcionar semanticamente pelo menos dentro deobject
s.