我试图理解自我语言。(没有实际编码!)
我想知道一种方法如何能够修改其接收器的插槽。我的理解是:在self中,'self *'被赋予激活记录的父指针。因此,如果方法无法在本地找到插槽,它将查找“self *”。但根据我的理解,当在任何对象中,如果我设置一个插槽(比如说“x”),它只设置一个本地插槽而不修改其父节点的插槽“a”。
答案 0 :(得分:3)
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 ).
|)
然后“Get It”并评估c
)