【问题标题】:Scala case pattern match error in case of Option[String] [duplicate]Scala case pattern match error in case of Option [String] [重复]
【发布时间】:2017-08-14 03:25:28
【问题描述】:

我正在尝试使用可变数量的参数创建一个函数

def foo(args: String*)

此函数的作用是消除空字符串并用逗号分隔其余字符串 (,)。

def foo(args: String*) = {
  args.flatMap {
    case str if str.isEmpty => None
    case str => Some(str)
  }.mkString(", ")
}

当我扩展此函数以支持 Option[String] 参数时

def foo(args: Any*) = {
  args.flatMap {
    case str: String if str.isEmpty => None
    case str: Option[String] if str.getOrElse("").isEmpty => None
    case str => Some(str)
  }.mkString(", ")
}

我收到一个警告说

警告:类型模式中的非变量类型参数字符串 Option[String] 未选中,因为它被擦除消除了

当我传递参数时

foo("", "Hello", Some(""), Some("what"))

我有错误

scala.MatchError: Some(what) (of class scala.Some) at $anonfun$makeAddress$1.apply(:12) 在 $anonfun$makeAddress$1.apply(:12)

我应该如何创建同样支持Option[String]的函数?

【问题讨论】:

标签: scala


【解决方案1】:

您可以完全使用收集和避免选项:

def foo(args: String*): String = {
  args.collect{case s if ! s.isEmpty => s}.mkString(",")
}

collect 相当于 filter 结合 map。

【讨论】:

    【解决方案2】:

    与您的解决方案类似

    def foo(args: Any*) = {
      args.flatMap {
        case str: String if !str.isEmpty => Option(str)
        case Some(str:String) if !str.isEmpty  => Option(str)
        case _ => None
      }.mkString(", ")
    }
    

    【讨论】:

    • 另外,在你的代码中,如果你在下面使用 println(foo("", "Hello", Some(null), Some("what"))) 会有一个错误
    • 不应该是 Some(str) 而不是 Option(str)?
    • no , Some(str) 主要用于模式匹配。问题是 Some(null) != None 和 Option(null) == None 。你可以在 scala REPL 中尝试一下。
    猜你喜欢
    • 2022-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多