6

私は Scala を評価していますが、その不変コレクションに問題があります。

私は不変のコレクションを作りたいと思っています。これは完全に不変であり、含まれているすべてのオブジェクト、それらが参照するオブジェクトを無限に通過します。

これを行う簡単な方法はありますか?

http://www.finalcog.com/immutable-containers-scalaのコードは、私が達成しようとしていることと、厄介な回避策 (ImmutablePoint) を示しています。

この回避策の問題点は、オブジェクトを変更するたびに手動で新しいコピーを作成する必要があることです。ランタイムがコピー オン ライトを実装する必要があることは理解していますが、これを開発者に透過的にすることはできますか?

メソッドが現在のオブジェクトの状態を変更する不変オブジェクトを作成しようとしていると思いますが、オブジェクトへの他のすべての「val」(およびすべての不変コンテナー) 参照は「古い」状態を保持します。

4

2 に答える 2

9

これは、すべてのオブジェクトが不変であるというイディオムに従わない限り、特定の言語構造を介して scala をそのまま使用することはできません。その場合、この動作は無料です!

2.8 では、読みやすさの観点から、名前付きパラメーターにより「コピー コンストラクター」が非常に使いやすくなりました。しかし、あなたは正しいです、これはコピーオンライトとして機能します。残念ながら(あなたにとって)、「現在の」オブジェクトが唯一の変更されたオブジェクトであるというあなたが求めている動作は、JVMの動作に完全に反します!

実際、「現在のオブジェクト」というフレーズには意味がありません。本当にあなたは「現在の参照を意味します! 同じオブジェクト erm を指す他のすべての参照 (現在のレキシカル スコープ外) は、同じオブジェクトを指しますオブジェクトは 1 つだけです。

したがって、このオブジェクトが現在のレキシカル スコープの観点から変更可能に見えるが、他のオブジェクトに対しては不変であるように見えることは不可能です。

于 2010-02-07T12:03:10.123 に答える