考虑 Ruby 中的 'self' 关键字的合适方法是什么?

What is an appropriate way to think of the 'self' keyword in Ruby?

关于self的语义,这样说是不是更合适:

  1. self 是一个关键字,它包含对当前接收者的引用。
  2. self 是 Ruby 中的 唯一 接收者。当您调用方法或调用 class 定义时,绑定到 self 的值将成为绑定到该对象的值的副本。按价值,我的意思是 unsigned long VALUE

换句话说,说 myObj 是消息的实际接收者是否准确,或者说 self 是真正的接收者和 [=16= 的副本? ] 绑定到 myObj 变量名的变量值被绑定到 self 变量名?

在后一种情况下,您只能说 self 正在接收一条消息,但 selfmyObj 碰巧引用了同一个对象。 (self 始终是当前对象)

在前一种情况下,您实际上可以说当前对象(消息接收者)发生了变化,Ruby 只是相应地更新了自身。

幕后发生了什么?

我之所以关注这种明显的任意区分,是因为我想弄清楚 Ruby "passes a message"

当您 "pass a message" 到一个对象时,消息名称用于确定要执行哪个方法定义。作为参数,该方法定义接收消息的其余部分和要用于 self.

的值

所以从方法代码的角度来看,self只是另一个参数。但是在 Ruby 源代码中,它不是在方法的形式参数列表中声明的,而是隐式的。

从这个意义上讲,肯定不是只有self才能收到消息,因为消息的调用者只有成为 self之后的消息已收到,并且仅在响应该消息的方法主体内继续如此。

Javascript 和 Ruby 一样,有一个预定义的名称(this 而不是 self),但其他语言对调用者的处理方式不同。有些允许您为其选择自己的名称,这可能因方法定义而异。也许调用者只是第一个形式参数,就像在 Perl 和 Python 中一样;使用这些语言,您的问题的答案可能会更清楚。或者,由于指定消息接收者的语法通常不同于传入参数的语法,因此可能同样有一种特殊的语法来声明调用参数,就像在 Go 中一样。

Ruby 有一个额外的问题,即不引用局部变量的裸词被解释为没有显式调用者的消息,并自动发送到 self。除此之外,self 只是另一个局部变量(恰好是预定义的和只读的)。

Ruby中的执行总是发生在对象实例的范围内。 self 是一个关键字,它指的是当前堆栈帧的接收者对象。在顶层,这是一个名为 main 的 Object 实例。每次将消息传递给接收者时,Ruby VM 都会将一个帧推入堆栈,其中包括该对象的接收者,然后通过 self 关键字公开该对象。

self 想成 "the receiver in the current stack frame" 可能是最准确的。为此,说 "self is the only receiver" 是不准确的,否则您永远无法更换接收器!