【问题标题】:In Scala return value itself for default pattern matching在 Scala 中返回值本身用于默认模式匹配
【发布时间】:2016-02-12 09:57:30
【问题描述】:

对于value: Any,我需要检查一个字符串大小写。
对于其他情况,应返回 value 本身。
什么是正确的语法:case _ => _ ?

def foo(value: Any) = value match {
  case x: String => if (x == "cond") None else x
  case _ => _ // Compiler -> Not found value x$1. Unbound placeholder parameter
}

【问题讨论】:

  • 如果您不关心不匹配的参数,只需返回NoneSome(value)(取决于您的应用逻辑),错误告诉您不能返回占位符。跨度>
  • 类型上的模式匹配违反了参数性 - typelevel.org/blog/2014/11/10/…

标签: scala pattern-matching


【解决方案1】:

只需使用一些(任意)标识符而不是_

def foo(value: Any) = value match {
  case x: String => if (x == "cond") None else x
  case other => other
}

但是,如果您在其他情况下不返回 Some,则在某些情况下返回 None 并不是最佳做法。更正确的版本是:

def foo(value: Any) = value match {
  case "cond" => None
  case other => Some(other)
}

那么无论哪种情况,你都有一个Option类型的对象。

【讨论】:

    【解决方案2】:

    这个简单的if-else 表达式也很简单,

    def foo(value: Any) = if (value == "cond") None else Some(value)
    

    这个更详细一点,

    def foo(value: Any) = Option(value).find( _ != "cond" )
    

    仅当value 等于"cond" 时才提供None。还可以考虑使用 for 理解,如下所示,

    def foo(value: Any) = for (v <- Option(value) if v != "cond") yield v
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2020-08-03
      • 2013-08-10
      相关资源
      最近更新 更多