免責事項:私は本当にうまく私の質問を説明するか分からない。私は明確化のための提案に満足しています。これは、例えば問題ではありませんしながら、Scalaでは参照を変更してオリジナルを変更しないようにするにはどうすればいいですか?
val a = DenseVector.ones[Double](2)
val b = a
b(1 to 1) := 2.0
a // return: breeze.linalg.DenseVector[Double] = DenseVector(1.0, 2.0)
よう
物事は、私のような数学の男性のための問題の一種でありますin R
a = c(1,1)
b = a
b[1] = 2.0
b // return: [1] 1 2
a // return: [1] 1 1
私は上記の現象がどのように呼び出されているのかわかりませんが、どうすれば避けられますか?私が正しく理解していれば、すべてのクラスでval
を使用することで回避されますと不変のコレクションです。コレクションの不変なコレクションの並べ替えがあり、各エントリはvar
の代わりにval
です。この非コピー・リファレンス・イシューは、オブジェクトに関数を与えるときにも起こります。何が起きるかははっきりしません(副作用ですが、新しく作成されたオブジェクトの代わりに返すとき)。 def myfct(val myparameter)
でも、var
のmyparameterが変更されないことを保証しないので、私はval
を排他的に与えるべきです。
これはすべてエラーが発生する可能性が高いです - 私はちょうど私が市長の間違いをするのを待っています。非常にまれにしか、深いコピーではなくオブジェクトへの参照を渡したいと思うだけです。ユニットテストは実際には唯一の方法ですか(また、発生する可能性のあるすべてのエラーを考えなくてはなりません)深いコピー(新しいオブジェクトを作成することによって明示的または暗黙的に)をすることを忘れないでテストできますか?
参照を変更してオリジナルを変更するのを間違えないようにするにはどうすればよいですか? val
と不変なコレクションを使用する唯一の答えはありますか、別のデザインパターンがありますか?例えば。入力が変更可能なコレクションであっても、あるいは変更可能なメンバを持つオブジェクトであっても、関数への入力パラメータを不変にすることができるデザインパターンはありますか?
Scalaは、あなたが望むように不変です:あなたが不変構造を使用する場合、それらは...まあ...不変です。変更可能なものを使用する場合、それらは変更できません。 私はあなたの問題が何であるかを理解していません。突然変異の可能性のあるものが好きでない場合は、使用しないでください。深いコピーをしないでください(非効率的で遅いです)。不変な構造体を使用してください。 – Dima
'b [1] = 2.0'は、不変オブジェクトの操作のようには見えないので、おそらく不変性に関するものではありません。不変なオブジェクトを使用すると、参照問題は存在しません。そうでなければ最新のOOP言語はコピー参照のみを知っています。 –
@Dima:私は私の質問を改善しようとしました。 – Make42