如何在底层模式匹配`Option`?

时间:2014-07-21 15:29:20

标签: scala pattern-matching

它在Scala中说,模式匹配将转换为unapply(...):Option[...]的调用。

我在这里用unapply定义了一个对象:

object Hello {
  def unapply(s:String): Option[String] = Some(s)
}

然后我可以在模式匹配中使用它:

"hello" match {
   case Hello(s) => println(s)
}

实际上(可能)它将被转换为:

Hello.unapply("hello") match {
  case Some(s) => println(s)
  case _ =>
}

但此处的Some也是case class,因此会调用Some.unapply

那应该是无限的。这是不可能的。

那么Scala模式如何匹配底层的Option

1 个答案:

答案 0 :(得分:3)

unapply的结果再次没有模式匹配。相反,调用方法isEmptyget。所以你的例子会给出:

val temp = Hello.unapply("hello")
if (!temp.isEmpty) {
  val s = temp.get
  println(s)
} else {
  throw new MatchError()
}

从2.11开始,甚至没有必要返回Option,具体而言。使用方法isEmpty: Boolean和方法get: A的任何类都可以。