Unapply - 自定义提取器

可以通过实现 unapply 方法并返回 Option 类型的值来编写自定义提取:

class Foo(val x: String)

object Foo {
  def unapply(foo: Foo): Option[String] = Some(foo.x)
}

new Foo("42") match {
  case Foo(x) => x
}
// "42"

unapply 的返回类型可能不是 Option,只要返回的类型提供了 getisEmpty 方法。在这个例子中,Bar 是用这些方法定义的,unapply 返回 Bar 的一个实例:

class Bar(val x: String) {
  def get = x
  def isEmpty = false
}

object Bar {
  def unapply(bar: Bar): Bar = bar
}

new Bar("1337") match {
  case Bar(x) => x
}
// "1337"

unapply 的返回类型也可以是 Boolean,这是一个特殊情况,不符合上面的 getisEmpty 要求。但是,请注意在此示例中 DivisibleByTwo 是一个对象,而不是一个类,并且不接受参数(因此不能绑定该参数):

object DivisibleByTwo {
  def unapply(num: Int): Boolean = num % 2 == 0
}

4 match {                        
  case DivisibleByTwo() => "yes" 
  case _ => "no"
}
// yes

3 match {
  case DivisibleByTwo() => "yes"
  case _ => "no"
}
// no

请记住,unapply 是一个类的伴随对象,而不是在类中。如果你理解这种区别,上面的例子就会很清楚。