阅读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
,在这种情况下,基本上myX
是myX
的别名。但是在我们的例子中-x
。 x @ 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