2011-07-19 4 views
5

Dans le code suivantcorrespondance de motif pour la variable de portée (Scala)

val x = 5 
val y = 4 match { 
    case x => true 
    case _ => false 
} 

la valeur y est vrai. Scala interprète x pour être une variable libre dans la correspondance de modèle au lieu de la lier à la variable avec le même nom dans la portée.

Comment résoudre ce problème?

+3

Pourquoi avez-vous dupliquez une question existante et répondre à vous-même? http://stackoverflow.com/questions/6172557/problem-with-scala-matching-scope http://stackoverflow.com/questions/5153590/why-does-scala-complain-when-given-this- pattern-match-on-an-integral-value – dhg

+0

@dhg: Je n'ai pas trouvé cette question sur SO, c'est pourquoi. Je réponds à ma propre question car je préfère utiliser SO comme un référentiel de connaissances au lieu de prendre une note sur mon petit blog caché ou de faire un post mental. Merci pour le lien, je suis d'accord avec la fermeture en double. – ron

Répondre

7

Invoquer le principe de moindre étonnement, je vais simplement faire:

val x = 5 
val y = 4 match { 
    case z if z == x => true 
    case _ => false 
} 
+0

Ron réponse est la bonne, vous ajoutez une condition qui peut être directement appariement . (downvote) – Nicolas

+0

Je pense que la condition est tout aussi rapide, et souvenez-vous du principe du moindre étonnement. (upvote) – Anonymous

+0

Vous avez un point avec ce principe. – ron

12

Backticking la variable indique pour lier une variable scope:

val x = 5 
val y = 4 match { case `x` => true; case _ => false } 

rendements false. En variante, si une variable commence par une lettre majuscule, elle se lie à une variable étendue sans retour arrière.

+0

voir aussi http://scala-programming-language.1934581.n4.nabble.com/scala-pattern-matching-proposal-td1999364.html – ron

Questions connexes