模式匹配空ArrayBuffer

时间:2014-06-16 15:58:27

标签: scala scala-collections

是否有任何特殊案例类用于表示可用于模式匹配的空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而不是模式匹配。

3 个答案:

答案 0 :(得分:5)

Jasper-M为您的第二个问题提供了一个很好的答案(为什么==有效,但模式匹配失败)。

至于你的第一个,Nil没有等同于ArrayBuffer。原因是List是使用scala的代数数据类型(ADT)概念定义的,而ArrayBuffer则不是。{/ p>

查看ArrayBuffer的{​​{3}}。它被实现为常规类,而List被实现为具有两个子类的抽象类:case object sourcecase 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 
}

我首先检查数组是否至少有一个元素,否则它应该是空的。