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,只要返回的型別提供了 get 和 isEmpty 方法。在這個例子中,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,這是一個特殊情況,不符合上面的 get 和 isEmpty 要求。但是,請注意在此示例中 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 是一個類的伴隨物件,而不是在類中。如果你理解這種區別,上面的例子就會很清楚。