unapply规则是否总是会返回一个选项?

Geo*_*Geo 6 functional-programming scala pattern-matching

我试图创建一个unapply在模式匹配中使用的方法,并且我试图使它返回不同的东西Option,但是,Eclipse将其显示为错误.这是一个unapply必须返回的规则Option[T]吗?

编辑:这是我正在尝试使用的代码.我切换了上一节中的代码,以便unapply返回一个布尔值

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")
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Eclipse说wrong number of arguments for object NumberMatcher.这是为什么?

Dan*_*ral 9

如果你想要退货unapply,请将其归还Some.Boolean如果可以匹配则返回测试.

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

str match { 
  case NumberMatcher(group) => println(group)
  case _ => println("no")
}
Run Code Online (Sandbox Code Playgroud)

假设NumberMatcher返回Option[...],它将执行:

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

如果NumberMatcher返回布尔值,那么你可以让它收到一些东西.在这种情况下,这是发生的事情:

str match { 
  case NumberMatcher() => println("yes")
  case _ => println("no")
}
Run Code Online (Sandbox Code Playgroud)

val r1 = NumberMatcher.unapply(str)
if (r1) {
  println("yes")
} else {
  println("no")
}
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*rio 7

再看看这个例子.我引用

应该按如下方式选择unapply的返回类型:
*如果它只是一个测试,则返回一个布尔值.例如case even()
*如果返回T类型的单个子值,则返回Option [T]
*如果要返回多个子值T1,...,Tn,请将它们分组到可选的元组选项中[(T1,...,TN).