它在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
?
答案 0 :(得分:3)
unapply
的结果再次没有模式匹配。相反,调用方法isEmpty
和get
。所以你的例子会给出:
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
的任何类都可以。