scala不适用于返回布尔值
在阅读中,我仍然对返回布尔值的scala不适用于返回布尔值,scala,pattern-matching,unapply,Scala,Pattern Matching,Unapply,在阅读中,我仍然对返回布尔值的unapply()有疑问 如果您想了解Scala编程手册(第二版),请参阅第602页。有一个例子: case Email(Twice(x @ UpperCase()), domain) => ... 其中大写定义为具有unapply()返回Boolean且不具有apply() 其中,两次是这样的: object Twice { def apply(s:String): String = s + s ... 问题(一定太多了,抱歉): 大写() 如果我通
unapply()
有疑问
如果您想了解Scala编程手册(第二版),请参阅第602页。有一个例子:
case Email(Twice(x @ UpperCase()), domain) => ...
其中大写定义为具有unapply()
返回Boolean
且不具有apply()
其中,两次
是这样的:
object Twice {
def apply(s:String): String = s + s
...
问题(一定太多了,抱歉):
大写()
如果我通过:DIDI@hotmail.com
,然后在第一个代码段中的x
='DI'。。然后我们使用“@”…绑定“x”将其传递到大写。unapply
调用unapply(x)
,即unapply('DIDI')
(?),然后返回True
但是为什么不选择选项
?我倾向于认为unapply
返回Option
。。这是一种工作方式。这可能是因为通常Option
包装一些数据,但对于简单的情况,我们不应该包装boolean?因为我们没有apply()
使用布尔
/选项
时有什么区别?基于这个例子
这个语法:x@UpperCase()
,如果我们在一个特定的大小写中进行匹配,它是否应该替换值匹配大小写
(我想是这样读的吗?)语法?这样做的方式/语法似乎并不统一
通常语法如下(假设x,y是Int):案例AA(x@myX,y)=>println(“myX:+myX)
表示x
绑定到myX
,基本上myX
是x
的别名。。在这种情况下。但是在我们的例子中-x@UpperCase()
x
绑定到UpperCase().unapply()
。。将x
作为参数。我的意思是,这里的绑定是一个非常抽象/广泛的概念。这很简单:
1) 如果您返回布尔值,您的unapply只会测试匹配查询
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) 如果返回选项[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
这并不是那么简单
“布尔测试”匹配的行为在最近的里程碑中刚刚更改:
apm@mara:~/clones/scala$ ./build/pack/bin/scala
Welcome to Scala version 2.11.0-20130911-042842-a49b4b6375 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
scala> object OK { def unapply(s: String) = Some(s) filter (_ == "OK") }
defined object OK
scala> import PartialFunction._
import PartialFunction._
scala> cond("OK") { case OK() => true }
<console>:12: error: wrong number of patterns for object OK offering String: expected 1, found 0
cond("OK") { case OK() => true }
^
<console>:12: error: wrong number of patterns for object OK offering String: expected 1, found 0
cond("OK") { case OK() => true }
^
scala> cond("OK") { case OK(x) => true }
res1: Boolean = true
scala> :q
以及提取器签名的处理方式。因此,基本上你是说,case可以与Option(Some.None)结果一起使用,就像与Boolean(true,false)结果一起使用一样好?但是关于“@”符号和与内部case匹配相关的语法呢。你觉得这足够统一吗?它比使用:value match{case SomeClass()=>match{case(AnotherClass)=>etc..}好吗?它应该是“FOO”match{case IsUpperCase(true)=>flag}我怀疑您的原始版本总是返回true。
apm@mara:~/clones/scala$ ./build/pack/bin/scala
Welcome to Scala version 2.11.0-20130911-042842-a49b4b6375 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
scala> object OK { def unapply(s: String) = Some(s) filter (_ == "OK") }
defined object OK
scala> import PartialFunction._
import PartialFunction._
scala> cond("OK") { case OK() => true }
<console>:12: error: wrong number of patterns for object OK offering String: expected 1, found 0
cond("OK") { case OK() => true }
^
<console>:12: error: wrong number of patterns for object OK offering String: expected 1, found 0
cond("OK") { case OK() => true }
^
scala> cond("OK") { case OK(x) => true }
res1: Boolean = true
scala> :q
apm@mara:~/clones/scala$ scalam
Welcome to Scala version 2.11.0-M4 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import PartialFunction._
import PartialFunction._
scala> object OK { def unapply(s: String) = Some(s) filter (_ == "OK") }
defined object OK
scala> cond("OK") { case OK() => true }
res0: Boolean = true
scala> cond("OK") { case OK(x) => true }
res1: Boolean = true