什么是一种适当的方式来思考自我' Ruby中的关键字?

时间:2015-04-21 19:36:26

标签: ruby messaging self message-passing

关于self的语义,更适合说:

  1. self是一个关键字,用于保存对当前接收者的引用。
  2. self是Ruby中仅接收器。调用方法或调用类定义时,绑定到self的值将成为绑定到该对象的值的副本。按价值,我的意思是unsigned long VALUE
  3. 换句话说,是否准确地说myObj是消息的实际接收者,或者它是自我是真正的接收者和unsigned long VALUE变量的副本的情况绑定到myObj变量名的值是否绑定到self变量名?

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

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

    引擎盖下怎么回事?

    我担心这种明显的任意区别的原因是因为我试图找出Ruby"如何传递消息"

2 个答案:

答案 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视为“当前堆栈帧中的接收器”可能是最准确的。为此,说“自我是唯一的接收者”是不准确的,否则你永远不会改变接收者!