我尝试创建一个用于模式匹配的 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/