¿Es posible hacer coincidir 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".
scala
pattern-matching
Teorema apropiado
fuente
fuente
case x if x.size > 2 => ...
Respuestas:
Puede agregar una protección, es decir,
if
una expresión booleana y después del patrón:Editar: Tenga en cuenta que esto es más que superficialmente diferente a poner un
if
después del=>
, porque un patrón no coincidirá si el guardia no es cierto.fuente
Como una 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 de
match
:Ahora, la documentación de
scala.math.Ordering.compare(T, T)
promesas solo promete que los resultados no iguales serán mayores o menores que cero . JavaComparable#compareTo(T)
se especifica de manera similar a Scala. Resulta que es convencional usar 1 y -1 para los valores positivos y negativos, respectivamente, como lo hace la implementación actual de Scala , pero uno no puede hacer tal suposición sin algún riesgo de que la implementación cambie desde abajo.fuente
compare()
ycompareTo()
no especificar 0, 1 y -1 como su codominio.Una solución que, en mi opinión, es mucho más legible que agregar guardias:
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
a-1
para un número negativo (menor que 10),1
para positivo (mayor que 10) o0
para cero (igual a 10).fuente
Si bien todas las respuestas anteriores y siguientes responden perfectamente a la pregunta original, se puede encontrar información adicional en la documentación https://docs.scala-lang.org/tour/pattern-matching.html , no encajaron en mi caso pero debido a que esta respuesta de stackoverflow es la primera sugerencia en Google, me gustaría publicar mi respuesta, que es un caso de la pregunta anterior.
Mi pregunta es:
Que se puede parafrasear:
La respuesta es el siguiente código de ejemplo:
enlace al scala fiddle: https://scalafiddle.io/sf/G37THif/2 como puede ver, la
case xs if n <= 0 => xs
declaración puede usar n (argumento de una función) con la declaración de guardia (if).Espero que esto ayude a alguien como yo.
fuente