是否有任何特殊的案例类来表示空 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
而不是模式匹配。
最佳答案
Jasper-M 为您的第二个问题提供了很好的答案(为什么 ==
有效但模式匹配失败)。
至于你的第一个,没有等同于 Nil
为 ArrayBuffer
.原因是List
使用 Scala 的代数数据类型 (ADT) 概念定义,而 ArrayBuffer
不是。
看看source为 ArrayBuffer
.它是作为一个普通类实现的,而 List
被实现为具有两个子类的抽象类:一个 case object
Nil , 和 case class
:: .
这些 case
类允许您在 List
上进行模式匹配.由于 ArrayBuffer
没有等效项,你不能模式匹配。
关于scala - 模式匹配空 ArrayBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247756/