Scala 集合库是面向不变性的,不变性不仅仅指不允许你修改给定集合的事实,而且保证你的集合永远不会被任何人修改。
因此,您不能也不应该从 Scala 中的可变缓冲区中获取像 immutable.Seq 这样的集合作为视图,因为它违反了该保证。
但是你可以很容易地实现不可修改的可变 Seq 的概念,如下所示:
class UnmodifiableSeq[A](buffer: mutable.Seq[A]) extends mutable.Seq[A]{
def update(idx: Int, elem: A) {throw new UnsupportedOperationException()}
def length = buffer.length
def apply(idx: Int) = buffer(idx)
def iterator = buffer.iterator
}
用法:
val xs = Array(1, 2, 3, 4)
val view = new UnmodifiableSeq(xs)
println(view(2)) >> 3
view(2) = 10 >> Exception in thread "main" java.lang.UnsupportedOperationException
编辑 :
获得集合的不可修改视图的一种可能更好的方法是向下转换为collection.Seq
不提供可变更新操作的方法:
val xs = Array(1, 2, 3)
val view: Seq[Int] = xs //this is unmodifiable
Seq
或者如果您有自己的自定义可变类,则创建一个扩展的包装器。
class UnmodifiableView[A](col: MutableCollection[A]) extends collection.Seq[A]{
def length = col.length
def apply(idx: Int) = col(idx)
def iterator = col.iterator
}
该scala.collection.Seq
特征不保证不可变性,但它也不允许任何修改操作,因此它看起来非常合适。