Scalaコレクションライブラリは不変性を対象としており、不変性とは、特定のコレクションを変更することが許可されていないという事実だけでなく、コレクションが誰によっても変更されないことが保証されているということも指します。
したがって、Immutable.Seqのようなコレクションを、Scalaの可変バッファーからのビューとして取得することはできません。また、取得するべきではありません。これは、その保証に違反するためです。
しかし、次のように簡単に変更不可能な可変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
特性は不変性を保証するものではありませんが、変更操作を許可しないため、完全に適合しているように見えます。