scala - 模式匹配为 ArrayBuffer 和 Seq 返回不同的结果

标签 scala scala-2.11

在下面的示例中,有一个函数 seqResult,它与 Seq 进行模式匹配。另一个接受变量参数的函数调用 seqResult 并传入 ArrayBuffer。这会导致使用 Seq 或使用 ArrayBuffer 调用时模式匹配结果不同。

使用 Seq 匹配器命中 case head::rest => ...,使用 ArrayBuffer 匹配器命中 case Seq(一,二) => ....

这是一个错误吗?有什么办法可以防止这种情况发生吗?

如果这不是错误,那么匹配适用于 Seq(a,b)ArrayBuffer(a,b) 的 1 个或多个条目的列表的安全方法是什么

def seqResult(arr:Seq[String]) = arr match {
  case Nil =>  "Nil"
  case head :: Nil => "head :: Nil"
  case head :: rest => "head :: rest"
  case Seq(one, two) => "one, two"
  case _ => "other"
}

def varArgResult(args:String*) = seqResult(args)

val ab = varArgResult("one", "two")
val se = seqResult(Seq("one", "two"))

println(ab) //=> "one, two"
println(se) //=> "head :: rest"

最佳答案

::List 的提取器对象。由于列表是 Seq 的默认实现,因此这就是您在使用 Seq(a, b, ...) 时看到的内容。

Seq 的提取器是 +:

关于scala - 模式匹配为 ArrayBuffer 和 Seq 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35727584/

相关文章:

function - scala 函数文字中的 `=>`

generics - 从通用集合中选择类型的子集

scala - 有没有更好的方法来显示整个 Spark SQL DataFrame?

sbt - 进化会自动创建数据库和表吗?

scala - 向 Scala 添加自定义编译时检查

scala - scala 中参数列表之前的 case 类中的 [] 这些括号有什么用

scala - 由于SSL连接已经关闭,如何解决Droping Close的错误

scala - "User did not initialize spark context"在 SPARK YARN 集群模式下使用 Scala 代码时出错

java - Scala 数组到 Java

scala - 如何在scaladoc中转义/*?