是否有任何特殊案例类用于表示可用于模式匹配的空ArrayBuffer
,类似于Nil
列表?
也是为什么这样做:
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]
更新
在考虑之后,我认为没有这样的案例类。虽然Nil
的存在对List
起作用至关重要,但数组不需要这种特殊结构。
我发现空匹配检查的解决方法可能在大多数情况下都有效:
collection.mutable.ArrayBuffer(2) match {
case collection.mutable.ArrayBuffer(v, _*) => v * 2
case _ => 0
}
我首先检查数组是否至少有一个元素,否则它应该为空。
事实证明,我可以使用ArrayBuffer.isEmpty
而不是模式匹配。
答案 0 :(得分:5)
Jasper-M为您的第二个问题提供了一个很好的答案(为什么==
有效,但模式匹配失败)。
至于你的第一个,Nil
没有等同于ArrayBuffer
。原因是List
是使用scala的代数数据类型(ADT)概念定义的,而ArrayBuffer
则不是。{/ p>
查看ArrayBuffer
的{{3}}。它被实现为常规类,而List
被实现为具有两个子类的抽象类:case object
source和case class
{{3} }。
这些case
类允许您在List
上进行模式匹配。由于ArrayBuffer
没有等价物,因此无法模式匹配。
答案 1 :(得分:2)
scala> collection.mutable.ArrayBuffer.empty == Nil
res11: Boolean = true
通过查看equals
方法的文档:
如果是与该序列具有相同元素的序列,则为true 以相同的顺序,否则
例如:
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
所以这与模式匹配无关。
答案 2 :(得分:0)
在考虑之后,我认为没有这样的案例类。虽然Nil
的存在对List
起作用至关重要,但数组不需要这种特殊结构。
我发现空匹配检查的解决方法可能在大多数情况下都有效:
collection.mutable.ArrayBuffer(2) match {
case collection.mutable.ArrayBuffer(v, _*) => v * 2
case _ => 0
}
我首先检查数组是否至少有一个元素,否则它应该是空的。