scala - 模式匹配空 ArrayBuffer

标签 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]

更新

经过一番思考后,我认为没有这样的案例类。虽然存在 NilList 至关重要要工作,数组不需要这种特殊的结构。

我找到了一种在大多数情况下可能有效的空匹配检查的解决方法:
collection.mutable.ArrayBuffer(2) match { 
  case collection.mutable.ArrayBuffer(v, _*) => v * 2
  case _ => 0 
}

我首先检查数组是否至少有一个元素,否则它应该是空的。
而且事实证明我可以只使用 ArrayBuffer.isEmpty而不是模式匹配。

最佳答案

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

至于你的第一个,没有等同于 NilArrayBuffer .原因是List使用 Scala 的代数数据类型 (ADT) 概念定义,而 ArrayBuffer不是。

看看sourceArrayBuffer .它是作为一个普通类实现的,而 List被实现为具有两个子类的抽象类:一个 case object Nil , 和 case class :: .

这些 case类允许您在 List 上进行模式匹配.由于 ArrayBuffer 没有等效项,你不能模式匹配。

关于scala - 模式匹配空 ArrayBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247756/

相关文章:

Scala 猫和遍历语法的任一种 - 不编译

scala - 使用新属性扩展 scala 集合

Scala 的 "This"和 MapLike

Scala:有条件地将项目添加到序列或合并序列

scala - Scala 中的多个 Trait 构造错误

scala - 如何在缩放时计算类型管道中行中列的频率?

scala - Spark-shell 命令抛出错误

scala - 您可以在 Scala 中的 for 理解中定义一个值(在 if 中)以便在yield 中使用

Scala Map 实现按插入顺序保留条目?

scala - 在 Scala 中使用基于类型的过滤器时如何获得正确的返回类型