Scala 如何匹配底层中的“选项”?
它说,在Scala中,模式匹配将被转换为调用Scala 如何匹配底层中的“选项”?,scala,pattern-matching,Scala,Pattern Matching,它说,在Scala中,模式匹配将被转换为调用不适用(…):Option[…] 在这里,我定义了一个对象,其未应用: object Hello { def unapply(s:String): Option[String] = Some(s) } 然后我可以在模式匹配中使用它: "hello" match { case Hello(s) => println(s) } 实际上(可能)它将转换为: Hello.unapply("hello") match { case Som
不适用(…):Option[…]
在这里,我定义了一个对象,其未应用:
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类
,因此将调用Some.unapply
这应该是无限的。这是不可能的
那么Scala模式如何匹配底层中的选项
?不应用的结果不再匹配模式。相反,调用方法isEmpty
和get
。因此,您的示例将给出:
val temp = Hello.unapply("hello")
if (!temp.isEmpty) {
val s = temp.get
println(s)
} else {
throw new MatchError()
}
从2.11开始,甚至不需要返回选项
。任何具有方法的类都是空的:布尔的和方法get:a
就可以了。未应用的结果不会再次进行模式匹配。相反,调用方法isEmpty
和get
。因此,您的示例将给出:
val temp = Hello.unapply("hello")
if (!temp.isEmpty) {
val s = temp.get
println(s)
} else {
throw new MatchError()
}
从2.11开始,甚至不需要返回选项
。任何具有方法的类都是空的:布尔的和方法get:a
就可以了。未应用的结果不会再次进行模式匹配。相反,调用方法isEmpty
和get
。因此,您的示例将给出:
val temp = Hello.unapply("hello")
if (!temp.isEmpty) {
val s = temp.get
println(s)
} else {
throw new MatchError()
}
从2.11开始,甚至不需要返回选项
。任何具有方法的类都是空的:布尔的和方法get:a
就可以了。未应用的结果不会再次进行模式匹配。相反,调用方法isEmpty
和get
。因此,您的示例将给出:
val temp = Hello.unapply("hello")
if (!temp.isEmpty) {
val s = temp.get
println(s)
} else {
throw new MatchError()
}
从2.11开始,甚至不需要返回选项
。任何具有方法isEmpty:Boolean
和方法get:a
的类都可以。