Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala不适用于返回布尔值_Scala_Pattern Matching_Unapply - Fatal编程技术网

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