Je fais des comparaisons avec certaines classes de cas et je voudrais gérer deux des cas de la même manière. Quelque chose comme ça:
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"
}
}
Mais quand je fais cela, j'obtiens l'erreur:
(fragment of test.scala):10: error: illegal variable in pattern alternative
case B(sb) | C(sc) => "B"
Je peux le faire fonctionner en supprimant les paramètres de la définition de B et C mais comment puis-je faire correspondre les paramètres?
scala
pattern-matching
Timdisney
la source
la source
case A(x) | B(x) => println(x)
être autorisé lorsque le type dex
est défini sur la limite supérieure dans le système de types de tout ce que A (x) et B (x) produisent.Il y a deux façons que je peux voir pour réaliser ce que vous recherchez, si vous avez des points communs entre les classes de cas. La première consiste à demander aux classes de cas d'étendre un trait qui déclare la similitude, la seconde est d'utiliser un type structurel qui supprime le besoin d'étendre vos classes de cas.
La méthode de type structurel génère un avertissement sur l'effacement qui, pour le moment, je ne sais pas comment éliminer.
la source
Eh bien, cela n'a pas vraiment de sens, n'est-ce pas? B et C sont mutuellement exclusifs, donc sb ou sc sont liés, mais vous ne savez pas lesquels, vous aurez donc besoin d'une logique de sélection supplémentaire pour décider lequel utiliser (étant donné qu'ils étaient liés à une Option [String], pas un string). Il n'y a donc rien de gagné à cela:
Ou ca:
la source
args match { case Array("-x", hostArg) => (hostArg, true); case Array(hostArg, "-x") => (hostArg, true) }
Cependant, je vois que ce n'est pas le cas courant et que la création d'une méthode locale est une alternative. Cependant, si l'alternative est pratique, il ne sert à rien d'avoir des alternatives de cas. En fait, dans certains dialectes ML, vous avez une fonctionnalité similaire et vous pouvez toujours lier des variables, tant (IIRC) que chaque variable est liée avec le même type sur les deux alternatives.