关于self
的语义,更适合说:
self
是一个关键字,用于保存对当前接收者的引用。self
是Ruby中仅的接收器。调用方法或调用类定义时,绑定到self
的值将成为绑定到该对象的值的副本。按价值,我的意思是unsigned long VALUE
换句话说,是否准确地说myObj
是消息的实际接收者,或者它是自我是真正的接收者和unsigned long VALUE
变量的副本的情况绑定到myObj
变量名的值是否绑定到self
变量名?
在后一种情况下,您只能说self
正在接收消息,但self
和myObj
碰巧引用同一个对象。 (self
始终是当前对象)
在前一种情况下,您实际上可以说当前对象(消息接收器)发生了变化,而Ruby只是相应地更新了自我。
引擎盖下怎么回事?
我担心这种明显的任意区别的原因是因为我试图找出Ruby"如何传递消息"
答案 0 :(得分:2)
当您向对象“传递消息”时,消息名称用于确定要执行的方法定义。作为参数,该方法定义接收消息的其余部分和用于self
的值。
因此,从方法代码的角度来看,self
只是另一个参数。但是在Ruby源代码中,它不是在方法的形式参数列表中声明的,而是隐含的。
从这个意义上说,只有self
才能接收消息,这当然不是真的,因为在收到消息后,只有的消息的调用<= em> self
,并且继续仅在响应该消息的方法体内。
与Ruby一样,Javascript具有预定义的名称(this
而不是self
),但其他语言以不同的方式处理调用。有些允许您为它选择自己的名称,这可能因方法定义而异。也许invocant只是第一个形式参数,如Perl和Python;在这些语言中,您的问题的答案可能更清晰。或者,由于指定消息接收者的语法通常与传入参数的语法不同,因此同样可能存在用于声明调用参数的特殊语法,如Go中所示。
Ruby还有一个额外的问题,即不引用局部变量的裸字被解释为没有显式调用的消息,并自动发送到self
。除此之外,self
只是另一个局部变量(恰好是预定义的和只读的)。
答案 1 :(得分:2)
Ruby中的执行总是发生在对象实例的范围内。 self
是一个关键字,它引用作为当前堆栈帧的接收者的对象。在顶层,这是一个名为main
的Object实例。每次将消息传递给接收者时,Ruby VM都会将一个帧推送到堆栈上,该堆栈包含该对象的接收者,然后通过self
关键字进行公开。
将self
视为“当前堆栈帧中的接收器”可能是最准确的。为此,说“自我是唯一的接收者”是不准确的,否则你永远不会改变接收者!