131 votes

Pourquoi le filtrage par motif dans Scala ne fonctionne-t-il pas avec les variables?

Prendre la fonction suivante:

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

Ce modèle correspond bien:

scala> fMatch("a")
It was a

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

Ce que je voudrais être en mesure de faire est la suivante:

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

Cela donne l'erreur suivante:

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

Je suppose que c'est parce qu'il pense que la cible est en fait un nom que vous souhaitez affecter à ce que les données d'entrée. Deux questions:

  1. Pourquoi ce comportement? Ne pouvez pas le cas, il suffit de regarder pour les variables dans la portée qu'ont type approprié et de l'utilisation de ces premier et, si aucun n'est trouvé, puis de traiter la cible sous un nom de patternmatch?

  2. Est-il une solution pour cela? De toute façon le modèle ' match contre les variables? Finalement, on peut utiliser un grand si l'énoncé, mais la casse est plus élégant.

263voto

Ben James Points 41165

Ce que vous cherchez est un identifiant stable. En Scala, celle-ci doit commencer avec une lettre majuscule, ou être entouré par des backticks.

Ces deux serait de solutions à votre problème:

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

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

Pour éviter accidentellement en se référant à des variables qui existait déjà dans le cadre englobant, je pense qu'il est logique que le comportement par défaut est de minuscules motifs variables et pas stable identifiants. Seulement quand vous voyez quelque chose commençant par une majuscule, ou dans les arrière-tiques, avez-vous besoin d'être conscient qu'il s'agit à partir de l'environnement de la portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X