Java中的"调用者"是否与Ruby中的"接收者"相同?

lor*_*orz 5 ruby java terminology

如果我说

x.hello()
Run Code Online (Sandbox Code Playgroud)

在Java中,对象x"调用"它包含的方法.

在Ruby中,对象x正在"接收"它包含的方法.

这只是表达相同想法的不同术语,还是这里的意识形态存在根本差异?

来自Java,我发现Ruby的"接收器"想法非常令人困惑.也许有人可以解释这与Java有关吗?

eri*_*son 12

在你的例子x没有打电话hello().无论什么对象包含该片段是"呼叫"(即,它是"呼叫者").在Java中,x可以称为接收器; 它正在接收对该hello()方法的调用.


Sar*_*Mei 6

差异不仅仅是术语.在Java中,VM确定给定对象是否"接受"您尝试发送的消息(即,您尝试调用的方法).如果对象的类型空间未定义该方法,则抛出异常并且永远不会传递消息.

在Ruby中,始终传递消息.对象可能会找到匹配它的方法,或者它可能不匹配,在后一种情况下,它可能会抛出异常,或者它可能不会.Rails建立在这个基本差异之上.这就是为什么没有像DB支持的Web应用程序框架在Java平台上像Rails一样有用的原因之一(尽管有些已经接近).


Mar*_*c W 5

如果我错了,有人会纠正我,但我认为你不能将这些术语应用于Java.Ruby来自Smalltalk,它使用消息(而不是方法)在对象之间进行通信.从技术上讲,当您myObj.to_s在Ruby中执行操作时,您将发送to_s消息,myObj并相应地对该消息进行操作.使用该模型,myObj确实是此消息的接收者,并且拥有发送消息的行的类是发送者.

在Java中,这不存在.您有调用方法的对象.没有发件人和收件人.当你说意识形态存在根本差异时,你说得对.

  • @Aaron:这只是术语,是的,但它是一种不同的思维方式,也是思考它们如何运作的不同方式.Java和Ruby在方法调用与消息传递方面有很多不同之处,必须以任何可能的方式理解这些差异才能成为一个优秀的,与语言无关的开发人员. (3认同)
  • 这只是术语:在一个方法`this`是接收器的指针,你可以使用诸如`sun.reflect.Reflection.getCallerClass`之类的东西和一个方法调用is_a message send来检索发送者(或调用者). (2认同)