Вы хотите выполнить сопоставление с образцом следующим образом?
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
в новую коллекцию.
РЕДАКТИРОВАТЬ:
Iterable
может быть бесконечным. В этом случае .toSeq
может привести к сбою вашей программы. Таким образом, самым безопасным способом будет вызов .take(n)
перед сопоставлением с образцом.
11.10.2018