阅读this时,我仍然对返回unapply()Boolean有疑问。

如果看一下Scala编程手册(第二版),第602页。有一个示例:

case Email(Twice(x @ UpperCase()), domain) => ...


其中UpperCase定义为具有unapply()返回Boolean且没有apply()的对象

object UpperCase {
 def unapply(s:String): Boolean = s.toUpperCase == s
}


Twice是这样的:

object Twice {
 def apply(s:String): String = s + s
 ...


问题是(必须太多,对此感到抱歉):

UpperCase()。unapply(..)在这里如何工作?

如果我通过:[email protected],则在第一个代码段中为x ='DI'..然后我们使用'@'..绑定'x'将其传递给UpperCase.unapply以调用unapply(x)即(?)然后返回unapply('DIDI')

但是为什么不True呢?我倾向于认为Option返回unapply ..这是一种工作方式。那可能是因为通常Option包装一些数据,但是对于简单的情况,我们不应该包装布尔值?并且因为我们没有apply()?

使用Option / Boolean有什么区别?基于此示例。

而这种语法:Option,如果我们在一个特定的x @ UpperCase()内部进行匹配,是否应该用value match case替代(我想这样阅读)?看来这不是统一的方法/语法。

通常的语法如下(假设x,y是Int):case表示case AA(x @ myX, y) => println("myX: " + myX)绑定到x,在这种情况下,基本上myXmyX的别名。但是在我们的例子中-xx @ UpperCase()绑定到x ..将UpperCase().unapply()作为参数。我的意思是,这里的绑定是非常抽象/广泛的概念。

最佳答案

这很简单:

1)如果返回布尔值,则您的取消应用只会测试匹配的查询

scala> object UpperCase {
     | def unapply(s: String) = s.toUpperCase == s
     | }
defined module UpperCase

scala> "foo" match {
     | case UpperCase() => true
     | case _ => false
     | }
res9: Boolean = false


2)如果返回Option [T],则会创建一个提取器,该提取器将T解开

scala> object IsUpperCase {
     | def unapply(s: String) = Option(s).map(x => x.toUpperCase == x)
     | }
defined module IsUpperCase

scala> "FOO" match {case IsUpperCase(flag) => flag}
res0: Boolean = true

09-06 07:24