【发布时间】:2013-07-27 14:58:23
【问题描述】:
我正在努力理解自己的语言。(没有实际编码!)
我想知道一个方法如何能够修改其接收者的插槽。我的理解是:在self中,'self*'作为激活记录的父指针给出。因此,如果一个方法无法在本地找到插槽,它将查找“self*”。但据我了解,当我在任何对象中设置一个插槽(比如“x”)时,它只会设置一个本地插槽,而不会修改其父级的插槽“a”。
【问题讨论】:
标签: selflanguage
我正在努力理解自己的语言。(没有实际编码!)
我想知道一个方法如何能够修改其接收者的插槽。我的理解是:在self中,'self*'作为激活记录的父指针给出。因此,如果一个方法无法在本地找到插槽,它将查找“self*”。但据我了解,当我在任何对象中设置一个插槽(比如“x”)时,它只会设置一个本地插槽,而不会修改其父级的插槽“a”。
【问题讨论】:
标签: selflanguage
Self 中的槽,无论是接收器的“本地”还是任何其他对象的“远程”,实际上根本不能直接写入。
这意味着即使是“self”也无法直接更改本地槽(即没有元编程和镜像)。
(你可以找到一个很好的讨论in the Self handbook)
但是,当您在对象创建时创建插槽时,您可以决定是否使用插槽 是“可写的”。那是怎么回事,当我说没有可写的插槽时?
所以,你有一个对象:
(| a = 3. |)
那么a 是永远不可写的,但是当你说时
(| 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)
【讨论】:
p添加到大厅以使其在o的创建中可用