[英]How to pattern-match an `Option` in the underlying?
它说在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
?
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
方法get: A
都可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.