scala - 为什么这个Option要转换成String? [斯卡拉]

标签 scala functional-programming language-features pattern-matching

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

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")
      }
    }
  }
}

我想为包含数字的字符串添加模式匹配(这样我可以了解有关模式匹配的更多信息),并且在 unapply 中我决定返回 Option[String] 。但是,在 NumberMatcher 情况下的 println 中,group 被视为字符串,而不是Option。你能透露一些情况吗?运行时产生的输出是:

12,493,否

最佳答案

看看this example .

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

case NumberMatcher(group) => println(group)

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

关于scala - 为什么这个Option要转换成String? [斯卡拉],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1903126/

相关文章:

java - 如何转义Java属性文件中的双列?

java - 类型安全配置 - 从程序设置占位符值

scala - `EitherT` 不应该是协变的吗?尤其是左派?

scala - 使用 immutable.ListMap 代替 mutable.LinkedHashMap

clojure - 在 Clojure 中的同一命名空间中使用函数之前,我是否需要声明函数?

c# - C#有没有类似于Python的通用换行符的东西

C++ 绑定(bind)回调到一个类

Java 对采用另一个类的子类的方法的引用

python - Python 函数中的最大参数数是多少?

language-design - 为什么std.parallel中没有 'forall'?