2014-06-16 48 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