gpt4 book ai didi

Scala 模式匹配变量绑定(bind)

转载 作者:行者123 更新时间:2023-12-05 08:21:15 24 4
gpt4 key购买 nike

当提取器返回 Option[<Type>] 时,为什么我不能以@-style 的方式绑定(bind)变量? IE。这个不行:

object IsUpperCase {
def unapply(s: String): Option[String] = {
if (s.toUpperCase() == s) {
Some(s)
} else {
None
}
}
}

val s = "DuDu@qwadasd.ru"
s match {
case u @ IsUpperCase() => println("gotcha!") // what? "wrong number of arguments for object IsUpperCase"?
case _ =>
}

但是这个有效!

val s = "DuDu@qwadasd.ru"
s match {
case IsUpperCase(u) => println("gotcha!")
case _ =>
}

另一方面,如果IsUpperCase看起来像这样:

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

然后第一个示例有效,第二个无效!为什么会这样?

最佳答案

what? "wrong number of arguments for object IsUpperCase"?

case u @ IsUpperCase() => println("gotcha!")

嗯,是的。 unapply的返回类型是Option[String],也就是说IsUpperCase的模式匹配必须接受一个参数,像这样:

case u @ IsUpperCase(_) => println("gotcha!") // I don't care about the parameter

符合第一种模式的 unapply 定义是这样的:

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

可用于对 IsUpperCase() 进行模式匹配。

关于Scala 模式匹配变量绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11284048/

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