【问题标题】:Why is this Option transformed to a String? [Scala]为什么这个选项被转换为字符串? [斯卡拉]
【发布时间】:2010-12-26 13:32:30
【问题描述】:

我仍然是 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,no

【问题讨论】:

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


    【解决方案1】:

    看看this example

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

    case NumberMatcher(group) => println(group)
    

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

    【讨论】:

    • 所以unapply 只能返回Option 类型?不能直接返回String?
    • 正确。 unapply 不能直接返回字符串。如果是这样,您将如何表明该模式不匹配。
    • Unapply 方法可以返回一个布尔值,在这种情况下匹配块的 case 子句使用一个空的模式参数列表。
    猜你喜欢
    • 2016-07-30
    • 2017-10-02
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多