Java中的“caller”和Ruby中的“receiver”是相同的吗?

8
如果我说
x.hello()

在Java中,对象x“调用”其包含的方法。

在Ruby中,对象x“接收”其包含的方法。

这只是表达相同思想的不同术语,还是在这里存在根本性的差异?

作为一个来自Java的人,我发现Ruby的“接收者”概念令人困惑。也许有人可以解释一下与Java的关系?


2
我不会说对象x正在“调用”它包含的方法。我会说我正在对象x上“调用”该方法。(我不会详细解释这个答案,因为今天我的大脑运转速度只有三分之二,雄心只有一半。) - Michael Myers
你所说的与 Erickson 的回答一致。 - lorz
1
那就这样吧。我想我会给他投票的。 - Michael Myers
3个回答

14
在您的例子中,x并没有调用hello()。包含该代码片段的任何对象都是“调用者”(即它是“caller”)。在Java中,x可以被称为接收器;它接收对hello()方法的调用。

6
区别不只是术语。在Java中,虚拟机决定是否“接受”你尝试发送的给定对象的消息(即,你尝试调用的方法)。如果对象的类型空间没有定义该方法,则抛出异常并且消息永远不会被传递。
在Ruby中,消息总是会被传递。对象可能会找到与其匹配的方法,也可能不会,在后一种情况下,它可能会抛出异常或者可能不会。Rails基于这个根本性差异构建。这是为什么尚未有像Rails在Java平台上那样有用的DB支持的Web应用程序框架的原因之一(尽管有些已经接近了)。

在Rails中,为什么这个功能如此有益呢? - lorz
1
一个例子是ActiveRecord中的ORM。您有一个表示数据库行的ActiveRecord对象,比如一本书。它没有与您的列对应的方法,但您可以执行诸如@book.isbn之类的操作。@book获取消息,注意到没有isbn方法,然后在关联的数据库表中查找具有该名称的列。如果找到正确名称的列,则返回该值。对于调用者来说,它看起来像是返回了一个值的方法调用。 - Sarah Mei
1
我明白了。所以 method_missing 负责在运行时找不到方法时能够换挡的能力。 - lorz

5
如果我说错了,请有人纠正我,但是我认为这些术语不能应用于Java。Ruby源自Smalltalk,它使用“消息”(而不是方法)在对象之间通信。从技术上讲,当你在Ruby中执行myObj.to_s时,你正在向myObj发送to_s消息,并且它会相应地执行该消息。在这种模型中,myObj确实是这条消息的接收者,拥有发送该消息的代码行的类是发送方。
在Java中,这种情况不存在。你有一些对象,可以在其上调用方法。没有发送方和接收方。当你说存在一种根本性的思想差异时,你是正确的。

1
我对你的想法是一致的,所以我希望那些投票反对你的人能够解释一下原因。 - lorz
2
这只是术语:在一个方法中,this是指接收者的指针,您可以使用诸如sun.reflect.Reflection.getCallerClass之类的东西检索发送者(或调用者),而方法调用则是一种消息发送。 - Aaron Maenpaa
是的...我同意,解释会很好。 - Marc W
3
@Aaron:这只是术语,但它代表了不同的思维方式和思考它们工作方式的不同方式。Java和Ruby在很多方面都有根本性的不同,而这些差异必须以任何可能的方式理解,才能成为一名优秀的、无关语言的开发人员。 - Marc W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接