2016-03-01 33 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

剛剛添加了最後一個問題 - 在這種情況下,最佳匹配選項是什麼? –

相關問題