0

最近、このシナリオに何度か遭遇しました。

  1. クラスには不変の(インデックス付き?)シーケンスメンバーがあります
  2. ファクトリ メンバー メソッドは、シーケンスが多少変更された新しいインスタンスを作成します。

これを行う効率的な方法は何ですか?

class A( xs: IndexedSeq[Int] ) {
    def another: A = {
        val ys = xs.toArray.clone()   // !!!
        ys(7) = 13
        new A(ys)
    }
}

元の xs が既に配列であった場合、 toArray がこれを返すだけでオブジェクトを変更するのではないかと心配しているため、このシーケンスをその場で変更し、.clone できるように .toArray を実行します (つまり、不変になることを意味します)。 ) 値。ただし、 xs が配列でない場合、これは明らかに 2 つのコピーを作成するので、それは避けたいと思います。明らかに、その型をチェックすることもできますが、それは非常に洗練されていないようで、配列をラップできる他の可変シーケンスに対してチェックする必要があるかどうかはよくわかりません。どうする?

scala> val xs: Seq[Int] = Array(1, 2, 3)
ss: Seq[Int] = WrappedArray(1, 2, 3)

scala> val ys = xs.toArray
ys: Array[Int] = Array(1, 2, 3)

scala> ys(1) = 22

scala> ys
res1: Array[Int] = Array(1, 22, 3)

scala> xs
res2: Seq[Int] = WrappedArray(1, 22, 3)
4

1 に答える 1

2

可変性が本当に必要ない場合は、不変のシーケンスを要求するのが最善です。そうすれば、データの変更に副作用があるかどうかを心配する必要がなくなります。

class A(xs: collection.immutable.IndexedSeq[Int]) {
  def another: A = {
    val ys = xs.updated(7, 13)
    new A(ys)
  }
}
于 2013-10-19T17:28:50.183 に答える