2016-03-01 34 views
1

在下面的示例中,有一个功能seqResult,该模式与Seq匹配。另一个接受可变参数的函数调用seqResult并传入ArrayBuffer。这会使模式匹配结果与SeqArrayBuffer调用时不同。模式匹配对ArrayBuffer返回不同结果并且Seq

Seq匹配器命中case head :: rest => ...,与ArrayBuffer匹配器命中case Seq(one, two) => ...

这是一个错误?无论如何要保护这一点?

如果它不是一个bug,匹配一个或多个条目的列表的安全方法是什么?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" 

回答

1

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

Seq s的提取器是+:

+0

干杯 - 我在找什么 –

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::rest是语法糖List匹配和可表示为List(head, rest)这是你的情况匹配se

+0

刚刚添加了最后一个问题 - 在这种情况下,最佳匹配选项是什么? –

相关问题