模式匹配 returns ArrayBuffer 和 Seq 的不同结果
pattern match returns a different result for ArrayBuffer and Seq
在下面的示例中,有一个函数 seqResult
模式匹配 Seq
。另一个接受可变参数的函数调用 seqResult
并传入一个 ArrayBuffer
。当使用 Seq
或 ArrayBuffer
.
调用时,这会导致模式匹配结果不同
Seq
匹配器命中case head :: rest => ...
,ArrayBuffer
匹配器命中case Seq(one, two) => ...
。
这是一个错误吗?有没有办法防止这种情况?
如果不是错误,匹配适用于 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"
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::rest
是 List
匹配的语法糖,可以表示为 List(head, rest)
,在您的情况下匹配 se
。
::
是 List
的提取器对象。由于列表是 Seq
的默认实现,这就是您在使用 Seq(a, b, ...)
时看到的内容。
Seq
s 的提取器是 +:
。
在下面的示例中,有一个函数 seqResult
模式匹配 Seq
。另一个接受可变参数的函数调用 seqResult
并传入一个 ArrayBuffer
。当使用 Seq
或 ArrayBuffer
.
Seq
匹配器命中case head :: rest => ...
,ArrayBuffer
匹配器命中case Seq(one, two) => ...
。
这是一个错误吗?有没有办法防止这种情况?
如果不是错误,匹配适用于 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"
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::rest
是 List
匹配的语法糖,可以表示为 List(head, rest)
,在您的情况下匹配 se
。
::
是 List
的提取器对象。由于列表是 Seq
的默认实现,这就是您在使用 Seq(a, b, ...)
时看到的内容。
Seq
s 的提取器是 +:
。