Вы хотите выполнить сопоставление с шаблоном следующим образом?
val it: Iterable[Int] = ...
it match {
case Iterable(1, a, b) => ...
case Iterable(a, b) => ...
case Iterable() =>
}
Если да, на самом деле вы не можете сделать это, потому что объект-компаньон Iterable не имеет unapplySeq
метода.Так что самый простой способ сделать это - явное преобразование Iterable
в Seq
:
val it: Iterable[Int] = ...
it.toSeq match {
case Seq(1, a, b) => ...
case Seq(a, b) => ...
case Seq() =>
}
Или, если вы не хотите каждый раз вручную конвертировать Iterable
в Seq
, вы можетеиспользуйте что-то вроде этого:
object iterable {
def unapplySeq[A](it: Iterable[A]): Option[Seq[A]] = Some(it.toSeq)
}
val it: Iterable[Int] = ...
it match {
case iterable(1, a, b) => ...
case iterable(a, b) => ...
case iterable() =>
}
Но имейте в виду, что базовая коллекция не может быть Seq
.Такой подход может привести к копированию всего Iterable
в новую коллекцию.
EDIT:
Iterable
может быть бесконечным.В этом случае .toSeq
может привести к сбою вашей программы.Поэтому самым безопасным способом будет вызов .take(n)
до сопоставления с шаблоном