gpt4 book ai didi

scala unapply 返回 bool 值

转载 作者:行者123 更新时间:2023-12-04 19:52:01 26 4
gpt4 key购买 nike

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

如果查看 Scala Programming Book (2nd edition),第 602 页。有一个例子:

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

将大写定义为具有 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(..) 在这里如何工作?

如果我通过:DIDI@hotmail.com,那么第一个代码片段中的 x = 'DI'.. 然后我们使用 '@' ..to bind ' x' 将其传递给 UpperCase.unapply 以调用 unapply(x)unapply('DIDI') (?) 然后它返回 正确

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

使用 Boolean/Option 有什么区别?基于这个例子。

这个语法:x @UpperCase(),它应该替换 value match case(我想这样读它吗?)语法如果我们是否在一个特定的 case 内匹配?它似乎不像这样做的统一方式/语法。

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

最佳答案

这很简单:

1) 如果你返回 Boolean,你的 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) 如果您返回 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

关于scala unapply 返回 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com