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

标签 scala functional-programming pattern-matching

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

相关文章:

scala - 使用约束将 Apache Spark (Scala) 数据框中的 bool 列转换为数值列?

scala - 在scala中压缩不等长列表

parsing - Scala PacktRat 解析器将运算符限制为恰好 1

scala - Scala习惯用法,用于通过多个条件进行排序

python - Python 中的多维/多变量动态时间规整 (DTW) 库/代码

scala - 递归创建scala中字符串的所有旋转

scala - 如何使用日志编写清晰的代码?

functional-programming - 功能惯用的 FFT

arrays - 在 matlab 中查找二进制数组中位模式的位置

haskell - 为什么删除空约束会导致编译器错误?