考虑 Ruby 中的 'self' 关键字的合适方法是什么?
What is an appropriate way to think of the 'self' keyword in Ruby?
关于self
的语义,这样说是不是更合适:
self
是一个关键字,它包含对当前接收者的引用。
self
是 Ruby 中的 唯一 接收者。当您调用方法或调用 class 定义时,绑定到 self
的值将成为绑定到该对象的值的副本。按价值,我的意思是 unsigned long VALUE
换句话说,说 myObj
是消息的实际接收者是否准确,或者说 self 是真正的接收者和 [=16= 的副本? ] 绑定到 myObj
变量名的变量值被绑定到 self
变量名?
在后一种情况下,您只能说 self
正在接收一条消息,但 self
和 myObj
碰巧引用了同一个对象。 (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" 是不准确的,否则您永远无法更换接收器!
关于self
的语义,这样说是不是更合适:
self
是一个关键字,它包含对当前接收者的引用。self
是 Ruby 中的 唯一 接收者。当您调用方法或调用 class 定义时,绑定到self
的值将成为绑定到该对象的值的副本。按价值,我的意思是unsigned long VALUE
换句话说,说 myObj
是消息的实际接收者是否准确,或者说 self 是真正的接收者和 [=16= 的副本? ] 绑定到 myObj
变量名的变量值被绑定到 self
变量名?
在后一种情况下,您只能说 self
正在接收一条消息,但 self
和 myObj
碰巧引用了同一个对象。 (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" 是不准确的,否则您永远无法更换接收器!