Я выполняю сопоставление с некоторыми классами case и хотел бы обрабатывать два случая таким же образом. Что-то вроде этого:
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"
}
}
Но когда я это делаю, я получаю сообщение об ошибке:
(fragment of test.scala):10: error: illegal variable in pattern alternative
case B(sb) | C(sc) => "B"
Я могу заставить его работать, я удаляю параметры из определения B и C, но как я могу сопоставить их с параметрами?
scala
pattern-matching
Тимдисней
источник
источник
case A(x) | B(x) => println(x)
разрешение, когда типx
установлен равным верхней границе в системе типов того, что производят A (x) и B (x).Есть несколько способов, которыми я могу добиться того, что вам нужно, если у вас есть некоторая общность между классами case. Во-первых, классы case расширяют признак, декларирующий общность, второй - использовать структурный тип, который устраняет необходимость в расширении классов case.
Метод структурного типа генерирует предупреждение о стирании, которое в настоящее время я не знаю, как устранить.
источник
Что ж, в этом нет никакого смысла, не так ли? B и C являются взаимоисключающими, поэтому привязаны либо sb, либо sc, но вы не знаете, какой из них, поэтому вам потребуется дополнительная логика выбора, чтобы решить, что использовать (учитывая, что они были привязаны к Option [String], а не строка). Так что от этого ничего не добьешься:
Или это:
источник
args match { case Array("-x", hostArg) => (hostArg, true); case Array(hostArg, "-x") => (hostArg, true) }
Однако я вижу, что это не общий случай и альтернативой является создание локального метода. Однако, если альтернатива удобна, то нет смысла иметь альтернативные варианты. Фактически, в некоторых диалектах ML у вас есть аналогичная функция, и вы все еще можете связывать переменные, если (IIRC) каждая переменная связана с одним и тем же типом в обеих альтернативах.