1

我正在尝试理解自己的语言。(没有实际编码!)

我想知道一种方法如何能够修改其接收器的插槽。我的理解是:在self中,'self *'作为激活记录的父指针给出。因此,如果一个方法无法在本地找到插槽,它将查找“self*”。但据我了解,当我在任何对象中设置一个插槽(比如“x”)时,它只会设置一个本地插槽,而不会修改其父级的插槽“a”。

4

1 回答 1

3

Self 中的槽,无论是对于接收者来说是“本地的”还是像任何其他对象一样是“远程的”,实际上根本不是直接可写的。

这意味着即使“自我”也无法直接更改本地插槽(即没有元编程和镜像)。

自己的插槽访问

(你可以在 Self 手册中找到很好的讨论)

但是,当您在对象创建时创建槽时,您可以决定槽是否“可写”。那是怎么回事,当我说没有可写插槽时?

所以,你有一个对象:

(| a = 3. |)

thena永远不可写,但是当你说

(| a <- 3. |)

然后实际上创建了两个插槽:a,其中包含分配原语3a:其中包含分配原语。赋值原语能够改变 的内容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

于 2013-07-31T12:54:17.937 回答