Estoy haciendo una comparación con algunas clases de casos y me gustaría manejar dos de los casos de la misma manera. Algo como esto:
abstract class Foo
case class A extends Foo
case class B(s:String) extends Foo
case class C(s:String) extends Foo
def matcher(l: Foo): String = {
l match {
case A() => "A"
case B(sb) | C(sc) => "B"
case _ => "default"
}
}
Pero cuando hago esto, aparece el error:
(fragment of test.scala):10: error: illegal variable in pattern alternative
case B(sb) | C(sc) => "B"
Puedo hacerlo funcionar si elimino los parámetros de la definición de B y C, pero ¿cómo puedo hacer coincidir con los parámetros?
scala
pattern-matching
timdisney
fuente
fuente
case A(x) | B(x) => println(x)
le permitiera que el tipo dex
se establezca en el límite superior en el sistema de tipos de lo que sea que A (x) y B (x) produzcan.Hay un par de formas en las que puedo ver para lograr lo que buscas, si tienes algo en común entre las clases de casos. La primera es hacer que las clases de casos extiendan un rasgo que declare lo común, la segunda es usar un tipo estructural que elimina la necesidad de extender sus clases de casos.
El método de tipo estructural genera una advertencia sobre el borrado que, en este momento, no estoy seguro de cómo eliminar.
fuente
Bueno, realmente no tiene sentido, ¿verdad? B y C son mutuamente excluyentes, por lo que sb o sc se vinculan, pero no sabes cuál, por lo que necesitarías más lógica de selección para decidir cuál usar (dado que estaban vinculados a una Option [String], no una cuerda). Así que no se gana nada con esto:
O esto:
fuente
args match { case Array("-x", hostArg) => (hostArg, true); case Array(hostArg, "-x") => (hostArg, true) }
Sin embargo, veo que ese no es el caso común y que crear un método local es una alternativa. Sin embargo, si la alternativa es conveniente, entonces tiene poco sentido tener alternativas de caso. En realidad, en algunos dialectos ML tiene una característica similar y aún puede vincular variables, siempre que (IIRC) cada variable esté vinculada con el mismo tipo en ambas alternativas.