我正在尝试理解自己的语言。(没有实际编码!)
我想知道一种方法如何能够修改其接收器的插槽。我的理解是:在self中,'self *'作为激活记录的父指针给出。因此,如果一个方法无法在本地找到插槽,它将查找“self*”。但据我了解,当我在任何对象中设置一个插槽(比如“x”)时,它只会设置一个本地插槽,而不会修改其父级的插槽“a”。
我正在尝试理解自己的语言。(没有实际编码!)
我想知道一种方法如何能够修改其接收器的插槽。我的理解是:在self中,'self *'作为激活记录的父指针给出。因此,如果一个方法无法在本地找到插槽,它将查找“self*”。但据我了解,当我在任何对象中设置一个插槽(比如“x”)时,它只会设置一个本地插槽,而不会修改其父级的插槽“a”。
Self 中的槽,无论是对于接收者来说是“本地的”还是像任何其他对象一样是“远程的”,实际上根本不是直接可写的。
这意味着即使“自我”也无法直接更改本地插槽(即没有元编程和镜像)。
(你可以在 Self 手册中找到很好的讨论)
但是,当您在对象创建时创建槽时,您可以决定槽是否“可写”。那是怎么回事,当我说没有可写插槽时?
所以,你有一个对象:
(| a = 3. |)
thena
永远不可写,但是当你说
(| a <- 3. |)
然后实际上创建了两个插槽:a
,其中包含分配原语3
,a:
其中包含分配原语。赋值原语能够改变 的内容a
,这样你就可以说
(| a <- 3 |) a: 4 " => a is 4 now"
这是一个简单的消息发送。这在方法激活中没有什么不同。任何改变槽的行为都会发生
<-
),因此,当你的父母有一个分配槽时,你当然可以修改它的槽:
| 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
)