インスタンス変数 var を持つクラスがあります。
クラスメソッドを使用してオブジェクトが作成された場合を除いて、変数を変更/値に割り当てたくありません。
isImmutable: aBoolean は、可変オブジェクトを不変オブジェクトに、またはその逆に変換するメソッドです。
誰かがそれを行うための正しい構文を教えてもらえますか?
インスタンス変数 var を持つクラスがあります。
クラスメソッドを使用してオブジェクトが作成された場合を除いて、変数を変更/値に割り当てたくありません。
isImmutable: aBoolean は、可変オブジェクトを不変オブジェクトに、またはその逆に変換するメソッドです。
誰かがそれを行うための正しい構文を教えてもらえますか?
留意すべきことの 1 つは、不変性はオブジェクト グラフの単一レベルで機能するということです。インスタンス変数は、C++ の定数ポインターに少し似ています。アドレスは変更できませんが、内容は変更できます。
以下に少し例を示します。
| a b |
a := Array with: 1.
b := Array with: a.
b beImmutable.
b at: 1 put: nil.
^b
NoModificationError が発生します。b は不変であるため、b のインスタンス/インデックス付き変数を書き込むことはできません。
ただし、b のインスタンス/インデックス付き変数が指すオブジェクトに書き込むことができます。
| a b |
a := Array with: 1.
b := Array with: a.
b beImmutable.
a at: 1 put: 2.
^b
成功し、b は #(#(1)) ではなく #(#(2)) になりました
不変性をオブジェクトグラフのさらに下に伝播するように手配することもできます(ただし、循環に注意してください)。
コードを使用して実装しました:
MyClass class>>classMethod: aValue
anObject := self new value:aValue.
anObject isImmutable: true.
^anObject.