【问题标题】:Is the "caller" in Java the same as the "receiver" in Ruby?Java 中的“调用者”是否与 Ruby 中的“接收者”相同?
【发布时间】:2010-10-29 08:29:10
【问题描述】:

如果我说

x.hello()

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

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

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

来自 Java,我发现 Ruby 的“接收器”想法非常令人费解。也许有人可以用 Java 来解释这一点?

【问题讨论】:

  • 我不会说对象 x 正在“调用”它包含的方法。我会说我正在“调用”方法on 对象x。 (我不打算将其充实为答案,因为我的大脑今天以大约四分之三的速度和二分之一的野心运行。)
  • 您所说的与 Erickson 的回答一致。
  • 原来如此。猜猜我会投票给他,然后。

标签: java ruby terminology


【解决方案1】:

在您的示例中,x不是调用hello()。任何包含该 sn-p 的对象都是“调用”(即,它是“调用者”)。在Java中,x可以称为接收者;它正在接收对hello() 方法的调用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 为什么这个特性在 Rails 中有这么大的好处?
    • 一个例子是 ActiveRecord 中的 ORM。你有一个表示数据库行的 ActiveRecord 对象,比如一本书。它没有与您的专栏相对应的方法,但您可以执行@book.isbn 之类的操作。 @book 收到消息,注意到没有 isbn 方法,然后在关联的数据库表中查找具有该名称的列。如果它找到具有正确名称的列,则返回该值。对于调用者来说,它看起来像是一个返回值的方法调用。
    • 我明白了。所以 method_missing 负责在运行时找不到方法时换档的能力。
    【解决方案3】:

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

    在 Java 中,这不存在。您有可以调用方法的对象。没有发送者和接收者。当您说意识形态存在根本差异时,您说得对。

    【讨论】:

    • 我的想法会和你的一致,所以我希望投票给你的人能解释原因。
    • 这只是术语:在方法中this 是接收者的指针,您可以使用诸如sun.reflect.Reflection.getCallerClass 和方法调用is_a 消息发送来检索发送者(或调用者)。
    • 是的...我同意解释也很好。
    • @Aaron:这只是术语,是的,但这是一种不同的心态和一种不同的方式来思考它们的工作方式。 Java 和 Ruby 在方法调用与消息传递方面的根本区别不止于此,为了成为优秀的、与语言无关的开发人员,必须以任何可能的方式理解这些区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多