Scala之旅-Extractor对象

Scala之旅-Extractor对象

Extractor对象(Extractor Objects)

extractor对象是具有方法unapply的对象。方法apply类似于构造函数,传入参数并创建对象,与之相反,方法unapply传入对象并尝试返回参数。方法unapply最常用于模式匹配和partial函数。

import scala.util.Random
object CustomerID {
  def apply(name: String) = s"$name--${Random.nextLong}"
  def unapply(customerID: String): Option[String] = {
    val name = customerID.split("--").head
    if (name.nonEmpty) Some(name) else None
  }
}
val customer1ID = CustomerID("Sukyoung")  // Sukyoung--23098234908
customer1ID match {
  case CustomerID(name) => println(name)  // prints Sukyoung
  case _ => println("Could not extract a CustomerID")
}

方法apply由name创建了一个CustomerID字符串。方法unapply反之,从CustomerID字符串重新得到了name。当调用CustomerID("Sukyoung")时,这是调用CustomerID.apply("Sukyoung")的简写形式。当调用case CustomerID(name) => customer1ID时,我们就是在调用方法unapply。

方法unapply也可以被用来赋值。

val customer2ID = CustomerID("Nico")
val CustomerID(name) = customer2ID
println(name)  // prints Nico

这等价于val name = CustomerID.unapply(customer2ID).get。如果无法匹配,则抛出scala.MatchError:

val CustomerID(name2) = "--asdfasdfasdf"

方法unapply的返回类型应该从以下当中选择:

  • 如果只是一个测试,则返回Boolean类型。例如case even()
  • 如果返回类型T的单个sub-value,则返回Option[T]
  • 如果想要返回几个sub-value T1,…,Tn,则将它们放在一个可选的tuple组内Option[(T1,…,Tn)]

有时,sub-values的个数是固定的,并且我们想要返回一个序列。出于这个原因,你也可以通过unapplySeq来定义模式,它返回Option[Seq[T]]。这个机制用于在模式case List(x1, …, xn)中作为实例。

参考资料

本文译自Tour Of Scala – Extractor Objects

上一篇:Scala之旅-正则表达式模式

下一篇:Scala之旅-For Comprehensions

发表评论

电子邮件地址不会被公开。 必填项已用*标注