switch pattern for scala pattern-matching

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 y 0 si es igual.
  • Int.signum comprime la salida de compare en -1 para un número negativo (menos de 10), 1 para positivo (mayor que 10) o 0 para cero (igual a 10).