是",;呼叫者;在Java中,与;“接收者”;用红宝石?

是",;呼叫者;在Java中,与;“接收者”;用红宝石?,java,ruby,terminology,Java,Ruby,Terminology,如果我说 x.hello() 在Java中,对象x正在“调用”它所包含的方法 在Ruby中,对象x正在“接收”它所包含的方法 这仅仅是表达同一想法的不同术语,还是这里的意识形态存在根本性差异 来自Java,我发现Ruby的“接收者”概念相当令人困惑。也许有人可以用Java来解释这一点?如果我错了,有人会纠正我,但我认为你不能将这些术语应用到Java。Ruby来自Smalltalk,它使用消息(而不是方法)在对象之间进行通信。从技术上讲,当您在Ruby中执行myObj.to_s时,您将to_s消

如果我说

x.hello()
在Java中,对象x正在“调用”它所包含的方法

在Ruby中,对象x正在“接收”它所包含的方法

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


来自Java,我发现Ruby的“接收者”概念相当令人困惑。也许有人可以用Java来解释这一点?

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


在Java中,这是不存在的。您有调用方法的对象。没有发送方和接收方。你说得对,意识形态有根本的不同。

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

区别不仅仅在于术语。在Java中,VM确定给定对象是否“接受”您试图发送的消息(即您试图调用的方法)。如果对象的类型空间没有定义该方法,则会引发异常,并且永远不会传递消息


在Ruby中,消息总是传递的。对象可能会找到与其匹配的方法,也可能不会,在后一种情况下,它可能会抛出异常,也可能不会。Rails就是建立在这一根本区别之上的。这就是为什么在Java平台上还没有一个DB支持的web应用程序框架像Rails那样有用的原因之一(尽管有些已经接近了)。

我不会说ObjectX正在“调用”它所包含的方法。我会说我正在“调用”对象x上的方法。(我不打算把它具体化为一个答案,因为今天我的大脑以大约四分之三的速度运转,一半的雄心壮志。)你所说的与埃里克森的答案是一致的。的确如此。我想我会投票支持他。我的想法会与你的想法一致,所以我希望投票反对你的人能解释原因。这只是术语:在方法
中,这是一个指针,接收者,你可以检索发送者(或调用者)使用像sun.reflect.Reflection.getCallerClass这样的东西,方法调用就是发送消息。是的。。。艾伦:这只是术语,是的,但这是一种不同的思维方式和思考它们如何工作的不同方式。Java和Ruby在许多方面根本不同于方法调用和消息传递,为了成为一名优秀的、不懂语言的开发人员,必须以任何可能的方式理解这些差异。为什么这一特性在Rails中如此有利?ActiveRecord中的ORM就是一个例子。您有一个表示数据库行的ActiveRecord对象,比如一本书。它没有与您的专栏对应的方法,但您可以执行@book.isbn之类的操作@book获取消息,注意到没有isbn方法,然后在关联的数据库表中查找具有该名称的列。如果找到具有正确名称的列,则返回值。对调用方来说,它看起来像是一个返回值的方法调用。因此,方法_missing负责在运行时找不到方法时切换档位的能力。