在下面的示例中,有一个函数 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/