Scala: сопоставление с образцом по типу, но исключить указанные c подтипы? - PullRequest
0 голосов
/ 04 мая 2020

Например, если у меня есть конкретный базовый класс и подкласс:

class A
class B extends A

Меня интересует сопоставление с экземплярами A, которые НЕ являются также экземплярами B.

Возможны следующие подходы:

// Short-circuit
x match {
  case _: B => ()
  case _: A => println("Type A and not B")
  case _ => ()
}
// Using isInstanceOf
x match {
  case a: A if !a.isInstanceOf[B] => println("Type A and not B")
  case _ => ()
}

Но есть ли что-то более идиоматическое / сжатое / чистое? Спасибо

1 Ответ

2 голосов
/ 04 мая 2020

Вы можете определить пользовательский экстрактор

object ANotB {
  def unapply(a: A): Option[A] = a match {
    case _: B => None
    case _ => Some(a)
  }
}

x match {
  case ANotB(a) => ???
}
...