pattern - Uso de operadores de comparación en el sistema de coincidencia de patrones de Scala
scala for (3)
Como no respuesta al espíritu de la pregunta, que preguntaba cómo incorporar predicados en una cláusula de coincidencia, en este caso el predicado se puede factorizar antes del match
:
def assess(n: Int) {
println(
n compare 10 match {
case 0 => "ten"
case 1 => "greater than ten"
case -1 => "less than ten"
})
}
Ahora, la documentación de scala.math.Ordering.compare(T, T)
solo promete que los resultados no iguales serán mayores o menores que cero . El Comparable#compareTo(T)
de Java Comparable#compareTo(T)
se especifica de manera similar a la de Scala. Suele ser convencional usar 1 y -1 para los valores positivo y negativo, respectivamente, como lo hace la implementación actual de Scala, pero no se puede hacer tal suposición sin algún riesgo de que la implementación cambie desde abajo.
¿Es posible combinar en una comparación usando el sistema de coincidencia de patrones en Scala? Por ejemplo:
a match {
case 10 => println("ten")
case _ > 10 => println("greater than ten")
case _ => println("less than ten")
}
La segunda declaración de caso es ilegal, pero me gustaría poder especificar "cuando a es mayor que".
Puede agregar un guarda, es decir, una expresión booleana y una if
después del patrón:
a match {
case 10 => println("ten")
case x if x > 10 => println("greater than ten")
case _ => println("less than ten")
}
Editar: Tenga en cuenta que esto es más que superficialmente diferente a poner un if
después de =>
, porque un patrón no coincidirá si el guarda no es verdadero.
Una solución que en mi opinión es mucho más legible que agregar guardias:
(n compare 10).signum match {
case -1 => "less than ten"
case 0 => "ten"
case 1 => "greater than ten"
}
Notas:
-
Ordered.compare
devuelve un entero negativo si es menor que eso, positivo si es mayor y0
si es igual. -
Int.signum
comprime la salida decompare
en-1
para un número negativo (menos de 10),1
para positivo (mayor que 10) o0
para cero (igual a 10).