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.comparedevuelve un entero negativo si es menor que eso, positivo si es mayor y0si es igual. -
Int.signumcomprime la salida decompareen-1para un número negativo (menos de 10),1para positivo (mayor que 10) o0para cero (igual a 10).