为什么将此选项转换为字符串?[斯卡拉]

Geo*_*Geo 2 language-features functional-programming scala pattern-matching

我仍然是Scala noob,这让我很困惑:

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):Option[String] = {
    val pat = Pattern.compile("\\d+")
    val matcher = pat.matcher(x)
    if(matcher.find) {
      return Some(matcher.group())
    }
    None
  }
}

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

我想为包含数字的字符串添加模式匹配(所以我可以了解更多关于模式匹配的内容),并且unapply我决定返回一个Option[String].但是,在NumberMatcher案例中的println中,group被视为String而不是Option.你能解开一些光吗?运行此命令时产生的输出是:

12,493,no

Dar*_*rio 5

看看这个例子.

如果成功提取一个,则unapply返回该方法Some value,否则返回None.所以在内部

case NumberMatcher(group) => println(group)
Run Code Online (Sandbox Code Playgroud)

调用unapply并查看它是否返回某个值.如果是这样,我们已经有了真实的结果,因此没有Option类型.模式匹配从选项中提取返回的值.