2

ドキュメントは言う:

パッケージ scala.collection.immutable のコレクションは、誰に対しても不変であることが保証されています。このようなコレクションは、作成後に変更されることはありません

しかし、私はこれから期待する動作を得られません:

scala> var test3 = scala.collection.immutable.Set[String]("one", "two")
test3: scala.collection.immutable.Set[String] = Set(one, two)

scala> test3 += "three"

scala> println(test3)
Set(one, two, three)

ここで何が欠けていますか?

4

2 に答える 2

5

Avarは再代入できます (変数であるため、変化する可能性があります)。その後、以前のオブジェクトをまったく参照しなくなります。

Avalを再割り当てすることはできません (これはvalueであるため、変化することはできません) が、そのオブジェクトのメソッドを呼び出すことはできます (たとえば、値がmutableセットの場合)。

私が変化すると言うとき、私は基本的に参照が変化できないことを意味します。ちょっとややこしいですね、わかります。

別の言い方をすればval、 とvarの両方が、それ自体が変更可能な内部状態を持つオブジェクトを指すことができます。可変マップのように。

この表を検証するコード例を自分で作成することをお勧めします。

    | MutableSet                    | ImmutableSet
--------------------------------------------------
var | Reassign. Insert element      | Reassign
val | Insert                        | None of these
于 2016-06-02T17:13:20.003 に答える
3

コレクションを操作する際に (可能であれば) 避けるべきことが 2 つあります。ご存知のように、変更可能なコレクションよりも不変のコレクションの方が好まれます。ただし、不変のコレクションを可変変数に格納すると、問題が「遅延」するだけです。可変性を、それがもたらすすべての問題とともに、コレクション自体からコレクションを保持する変数に移動しました。いずれにせよ、状態があります。

理想的な解決策は、両方を避けることです。つまり、不変コレクションと不変フィールド (val) の両方を使用することです。たとえば、関数が不変のコレクションを生成し、他の関数がそれを使用することができます。コレクション自体をどこかに保持したり変更したりする必要はありません。

于 2016-06-02T15:24:00.637 に答える