A menudo escribo código que compara dos objetos y produce un valor según si son iguales o diferentes en función de cómo son diferentes.Scala: coincidencia de patrón cuando uno de los dos elementos cumple alguna condición
Así que podría escribir:
val result = (v1,v2) match {
case (Some(value1), Some(value2)) => "a"
case (Some(value), None)) => "b"
case (None, Some(value)) => "b"
case _ = > "c"
}
Esos casos 2 y 3 son los mismos de verdad, así que traté de escribir:
val result = (v1,v2) match {
case (Some(value1), Some(value2)) => "a"
case (Some(value), None)) || (None, Some(value)) => "b"
case _ = > "c"
}
Pero no hubo suerte.
Encuentro este problema en algunos lugares, y este es solo un ejemplo específico, el patrón más general es que tengo dos cosas, y quiero saber si una y solo una de ellas cumple algún predicado, entonces yo ' Quisiera escribir algo como esto:
val result = (v1,v2) match {
case (Some(value1), Some(value2)) => "a"
case OneAndOnlyOne(value, v: Option[Foo] => v.isDefined) => "b"
case _ = > "c"
}
Así que la idea aquí es que OneAndOnlyOne se puede configurar con un predicado (IsDefined en este caso) y se puede utilizar en múltiples lugares.
Lo anterior no funciona en absoluto, ya que es hacia atrás, el predicado debe pasar al extractor no devuelto.
¿Qué tal algo como esto?
val result = (v1,v2) match {
case (Some(value1), Some(value2)) => "a"
case new OneAndOnlyOne(v: Option[Foo] => v.isDefined)(value) => "b"
case _ = > "c"
}
con:
class OneAndOnlyOne[T](predicate: T => Boolean) {
def unapply(pair: Pair[T,T]): Option[T] = {
val (item1,item2) = pair
val v1 = predicate(item1)
val v2 = predicate(item2)
if (v1 != v2)
Some(if (v1) item1 else item2)
else
None
}
}
Pero, esto no compila.
¿Alguien puede ver la manera de hacer que esta solución funcione? ¿O proponer otra solución? Probablemente estoy haciendo esto más complicado de lo que es :)
¿Tiene un caso de uso que muestra por qué quiere hacer esto? Quizás exista una solución mejor usando 'Oither' –
Caso de uso: en general solo quiero evitar escribir los dos casos, p. (algunos, ninguno) y (ninguno, algunos). Mi caso de uso general es que estoy comparando dos productos en una característica en particular, y tal vez ambos productos tienen la característica, o solo uno de ellos, o si los dos tienen, tal vez uno tiene un buen valor para esa característica y uno es pobre valor. –
posible duplicado de [Coincidencia de varias clases de casos en Scala] (http://stackoverflow.com/questions/1837754/match-multiple-cases-classes-in-scala) – nawfal