Est-il possible de faire une correspondance sur une comparaison en utilisant le système de correspondance de modèles dans Scala? Par exemple:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
La deuxième déclaration de cas est illégale, mais j'aimerais pouvoir spécifier "quand a est supérieur à".
scala
pattern-matching
Convenant au théorème
la source
la source
case x if x.size > 2 => ...
Réponses:
Vous pouvez ajouter une garde, c'est-à-dire une
if
et une expression booléenne après le motif:Edit: Notez que c'est plus que superficiellement différent de mettre un
if
après le=>
, car un motif ne correspondra pas si la garde n'est pas vraie.la source
En tant que non-réponse à l'esprit de la question, qui demandait comment incorporer des prédicats dans une clause de correspondance, dans ce cas, le prédicat peut être pris en compte avant
match
:Maintenant, la documentation pour les
scala.math.Ordering.compare(T, T)
promesses seulement que les résultats non égaux seront supérieurs ou inférieurs à zéro . JavaComparable#compareTo(T)
est spécifié de la même manière que Scala. Il se trouve qu'il est conventionnel d'utiliser 1 et -1 pour les valeurs positives et négatives, respectivement, comme le fait l'implémentation actuelle de Scala , mais on ne peut pas faire une telle hypothèse sans un risque que l'implémentation change de dessous.la source
compare()
et decompareTo()
ne pas spécifier 0, 1 et -1 comme codomaine.Une solution qui à mon avis est bien plus lisible que l'ajout de gardes:
Remarques:
Ordered.compare
renvoie un entier négatif s'il est inférieur à cela, positif s'il est supérieur et0
s'il est égal.Int.signum
compresse la sortie decompare
à-1
pour un nombre négatif (inférieur à 10),1
pour positif (supérieur à 10) ou0
pour zéro (égal à 10).la source
Bien que toutes les réponses ci-dessus et ci-dessous répondent parfaitement à la question d'origine, des informations supplémentaires peuvent être trouvées dans la documentation https://docs.scala-lang.org/tour/pattern-matching.html , elles ne correspondaient pas à mon cas mais parce que cette réponse stackoverflow est la première suggestion de Google, je voudrais publier ma réponse qui est un cas secondaire de la question ci-dessus.
Ma question est:
Ce qui peut être paraphrasé:
La réponse est l'exemple de code ci-dessous:
lien vers scala fiddle: https://scalafiddle.io/sf/G37THif/2 comme vous pouvez le voir, l'
case xs if n <= 0 => xs
instruction est capable d'utiliser n (argument d'une fonction) avec l'instruction guard (if).J'espère que cela aide quelqu'un comme moi.
la source