Extracting sequences
The previous section explains extraction from case classes, and how to write custom extractors, but it does not explain how extraction works on sequences:
scala> val Array(a, b) = Array(1, 2) a: Int = 1 b: Int = 2
Rather than relying on an unapply
method, sequences rely on an unapplySeq
method defined in the companion object. This is expected to return an Option[Seq[A]]
:
scala> Array.unapplySeq(Array(1, 2)) Option[IndexedSeq[Int]] = Some(Vector(1, 2))
Let's write an example. We will write an extractor for Breeze vectors (which do not currently support pattern matching). To avoid clashing with the DenseVector
companion object, we will write our unapplySeq
in a separate object, called DV
. All our unapplySeq
method needs to do is convert its argument to a Scala Vector
instance. To avoid muddying the concepts with generics, we will write this implementation for [Double]
vectors only:
scala> import breeze.linalg._ import breeze.linalg._ scala> object DV {...