模式匹配为ArrayBuffer和Seq

时间:2016-03-01 16:00:21

标签: scala scala-2.11

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

如果Seq匹配器点击case head :: rest => ...,则ArrayBuffer匹配器会点击case Seq(one, two) => ...

这是一个错误吗?反正有没有防范这个?

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

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"

2 个答案:

答案 0 :(得分:2)

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

Seq的提取器为+:

答案 1 :(得分:1)

args: String*实际上是Array

Seq()构造函数使用基于ListBuffer的构建器,因此我们得到List数据类型。

object Seq extends SeqFactory[Seq] {
  def newBuilder[A]: Builder[A, Seq[A]] = new mutable.ListBuffer
}

...

println(Seq("one", "two"))

List(one, two)

head::restList匹配的语法糖,可以表示为List(head, rest),在您的情况下匹配se