Self のスロットは、レシーバーに対して「ローカル」であるか、他のオブジェクトのように「リモート」であるかに関係なく、実際には直接書き込み可能ではありません。
これは、「自己」でさえローカルスロットを直接変更できないことを意味します (つまり、メタプログラミングとミラーなしで)。
自己のスロット アクセス
( Self ハンドブックで適切な議論を見つけることができます)
ただし、オブジェクト作成時にスロットを作成すると、スロットが「書き込み可能」かどうかを決定できます。書き込み可能なスロットがないと言ったのはどうしてですか?
だから、あなたはオブジェクトを持っています:
(| a = 3. |)
thena
は決して書き込み可能ではありませんが、あなたが言うとき
(| a <- 3. |)
次に、実際には2 つのスロットが作成されます:a
を含む3
と、割り当てプリミティブa:
を含む。割り当てプリミティブは、次のように の内容を変更できます。a
(| a <- 3 |) a: 4 " => a is 4 now"
これは単純なメッセージ送信です。これは、メソッドのアクティベーションでも変わりません。スロットを変更する動作はいずれかになります
- assginments プリミティブ ( で定義
<-
) であるメソッドを介して、
- またはメタプログラミングとミラーを介して。
したがって、親に割り当てスロットがある場合、そのスロットを確実に変更できます。
| p . o |
p: (| a <- 3 |).
o: (|
parent* = p.
b <- 4.
c = ( a: 4 ).
|).
p a. "-> 3"
o c.
p a. "-> 4"
(あなたがそれをしたい場合は、次のshell
ようにします:
bootstrap addSlotsTo: bootstrap stub -> 'globals' -> () From: (|
p <- (| a <- 3 |).
|).
(|
parent* = p.
b <- 4.
c = ( a: 4 ).
|)
次に、「取得」して評価しc
ます)