2014-06-16 76 views
4

是否有任何特殊情況類表示空的ArrayBuffer,可用於模式匹配,類似於Nil的列表?模式匹配爲空ArrayBuffer

而且爲什麼這個工程:

scala> collection.mutable.ArrayBuffer.empty == Nil 
res11: Boolean = true 

雖然這並不:

scala> collection.mutable.ArrayBuffer() match { case Nil => 1 } 
<console>:8: error: pattern type is incompatible with expected type; 
found : scala.collection.immutable.Nil.type 
required: scala.collection.mutable.ArrayBuffer[Nothing] 

UPDATE

一番考慮我相信不存在這樣的情況下下課。儘管Nil的存在對List起作用是至關重要的,但陣列不需要這種特殊結構。

我已經找到了空的匹配檢查,可能在大多數情況下解決方法:

collection.mutable.ArrayBuffer(2) match { 
    case collection.mutable.ArrayBuffer(v, _*) => v * 2 
    case _ => 0 
} 

我第一次檢查,如果數組至少有一個元素,否則就應該是空的。 也事實證明,我可以只使用ArrayBuffer.isEmpty,而不是模式匹配。

+1

'ArrayBuffer.isEmpty'似乎更適合非ADT! ...或者只是'toList'你的ArrayBuffer,除非它太昂貴,並且在那上面工作。 –

回答

5

Jasper-M爲您的第二個問題提供了一個很好的答案(爲什麼==有效,但模式匹配失敗)。

對於您的第一個,沒有相當於Nil。原因是List是使用scala的代數數據類型(ADT)概念定義的,而ArrayBuffer則不是。

看看sourceArrayBuffer。它實現爲一個普通班,而List作爲一個抽象類有兩個子類實現:case objectNilcase class::

這些case類是什麼讓你模式匹配List。由於ArrayBuffer沒有等價物,因此無法匹配模式。

+0

感謝您確認我自己的想法。 – Anton

1
scala> collection.mutable.ArrayBuffer.empty == Nil 
res11: Boolean = true 

其原因,這是真,則可以通過查看equals方法的文檔中找到:

真,如果是具有以相同的順序相同的元件,因爲這序列 的序列否則爲false

例如:

scala> val buffer = collection.mutable.ArrayBuffer.empty[Int] 
buffer: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() 

scala> buffer.append(4) 

scala> buffer == List(4) 
res1: Boolean = true 

所以這與模式匹配無關。

+0

順便說一句,[有些人認爲斯卡拉缺乏*類型安全等於*的概念](https://stackoverflow.com/questions/19742527/why-has-scala-no-type-safe-equals-method ),這不會允許像op的例子那樣的東西,或者說,'1 == 1.0' –

0

給了我一些想法後,我認爲沒有這樣一個案例類。儘管Nil的存在對List起作用是至關重要的,但陣列不需要這種特殊結構。

我已經找到了空的匹配檢查,可能在大多數情況下解決方法:

collection.mutable.ArrayBuffer(2) match { 
    case collection.mutable.ArrayBuffer(v, _*) => v * 2 
    case _ => 0 
} 

我第一次檢查,如果數組至少有一個元素,否則就應該是空的。

+0

這個答案可能更適合作爲對原始問題的編輯。另外,你爲什麼不使用'ArrayBuffer#isEmpty'? – cdk

+0

好的,我會編輯我的問題。哇,不知道'ArrayBuffer'有這樣一個屬性。 – Anton