当提取器返回 Option[<Type>]
时,为什么我不能以@-style 的方式绑定(bind)变量? IE。这个不行:
object IsUpperCase {
def unapply(s: String): Option[String] = {
if (s.toUpperCase() == s) {
Some(s)
} else {
None
}
}
}
val s = "DuDu@qwadasd.ru"
s match {
case u @ IsUpperCase() => println("gotcha!") // what? "wrong number of arguments for object IsUpperCase"?
case _ =>
}
但是这个有效!
val s = "DuDu@qwadasd.ru"
s match {
case IsUpperCase(u) => println("gotcha!")
case _ =>
}
另一方面,如果IsUpperCase
看起来像这样:
object IsUpperCase {
def unapply(s: String): Boolean = {
return s.toUpperCase() == s
}
}
然后第一个示例有效,第二个无效!为什么会这样?
最佳答案
what? "wrong number of arguments for object IsUpperCase"?
case u @ IsUpperCase() => println("gotcha!")
嗯,是的。 unapply
的返回类型是Option[String]
,也就是说IsUpperCase
的模式匹配必须接受一个参数,像这样:
case u @ IsUpperCase(_) => println("gotcha!") // I don't care about the parameter
符合第一种模式的 unapply
定义是这样的:
object IsUpperCase {
def unapply(s: String): Boolean = s.toUpperCase() == s
}
可用于对 IsUpperCase()
进行模式匹配。
关于Scala 模式匹配变量绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284048/