gpt4 book ai didi

scala - 是否存在 unapply 总是返回 Option 的规则?

转载 作者:行者123 更新时间:2023-12-02 20:53:19 27 4
gpt4 key购买 nike

我尝试创建一个用于模式匹配的 unapply 方法,并尝试使其返回与 Option 不同的内容,但是,Eclipse 将其显示为错误。是否存在 unapply 必须返回 Option[T] 的规则?

编辑:这是我尝试使用的代码。我切换了上一节的代码,以便 unapply 返回一个 bool 值

import java.util.regex._

object NumberMatcher {
def apply(x:String):Boolean = {
val pat = Pattern.compile("\\d+")
val matcher = pat.matcher(x)
return matcher.find
}

def unapply(x:String):Boolean = {
val pat = Pattern.compile("\\d+")
val matcher = pat.matcher(x)
return matcher.find
}
}

object x {
def main(args : Array[String]) : Unit = {
val strings = List("geo12","neo493","leo")
for(val str <- strings) {
str match {
case NumberMatcher(group) => println(group)
case _ => println ("no")
}
}
}
}

Eclipse 提示对象 NumberMatcher 的参数数量错误。这是为什么?

最佳答案

如果您想通过 unapply 返回某些内容,请在 Some 中返回它。返回 Boolean 只是测试是否可以匹配。

以下是模式匹配的翻译方式:

str match { 
case NumberMatcher(group) => println(group)
case _ => println("no")
}

假设 NumberMatcher 返回 Option[...],它将执行以下操作:

val r1 = NumberMatcher.unapply(str)
if (r1 != None) {
val group = r1.get
println(group)
} else {
println("no")
}

如果NumberMatcher返回 bool 值,那么你可以让它接收一些东西。在这种情况下,会发生以下情况:

str match { 
case NumberMatcher() => println("yes")
case _ => println("no")
}

变成了

val r1 = NumberMatcher.unapply(str)
if (r1) {
println("yes")
} else {
println("no")
}

请注意,这是一个非常肤浅的解释。大小写匹配可以测试常量、有额外的保护条件、替代方案、递归使用 unapply、使用 unapplySeq 等。这里我只展示非常基本的用法来解决特定的问题问题。我强烈建议您搜索有关模式匹配的更完整的解释。

关于scala - 是否存在 unapply 总是返回 Option 的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1903341/

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