Является ли «вызывающий» в Java таким же, как «получатель» в Ruby? - PullRequest
5 голосов
/ 27 мая 2009

Если я скажу

x.hello()

В Java объект x "вызывает" содержащийся в нем метод.

В Ruby объект x "получает" содержащийся в нем метод.

Это просто другая терминология для выражения одной и той же идеи или здесь есть принципиальное различие в идеологии?

Исходя из Java, идея Руби о "приемнике" довольно сбивает с толку. Возможно, кто-то мог бы объяснить это по отношению к Java?

Ответы [ 3 ]

12 голосов
/ 27 мая 2009

В вашем примере x - это , а не , звонящий hello(). Какой бы объект ни содержал этот фрагмент, он "вызывает" (то есть это "вызывающая сторона"). В Java x может упоминаться как получатель; он получает вызов метода hello().

6 голосов
/ 27 мая 2009

Разница не только в терминологии. В Java виртуальная машина определяет, принимает ли данный объект сообщение, которое вы пытаетесь отправить (т. Е. Метод, который вы пытаетесь вызвать). Если пространство типов объекта не определяет этот метод, генерируется исключение, и сообщение никогда не доставляется.

В Ruby сообщение всегда доставлено. Объект может найти метод, который ему соответствует, или нет, и в последнем случае он может выдать исключение , а может и не . Rails построен на этой фундаментальной разнице. Это одна из причин того, почему на платформе Java пока нет такой полезной инфраструктуры веб-приложений с поддержкой БД, как Rails (хотя некоторые из них уже близко).

5 голосов
/ 27 мая 2009

Кто-то исправит меня, если я ошибаюсь, но я не думаю, что вы можете применить эти условия к Java. Ruby происходит от Smalltalk, которая использует messages (не методы) для связи между объектами. Технически, когда вы делаете myObj.to_s в Ruby, вы отправляете сообщение to_s на myObj, и оно соответственно действует на это сообщение. В этой модели myObj действительно является получателем этого сообщения, а класс, которому принадлежит строка, куда было отправлено сообщение, является отправителем.

В Java этого не существует. У вас есть объекты, для которых вы вызываете методы. Нет отправителей и получателей. Вы правильно поняли, когда сказали, что в идеологии есть фундаментальное различие.

...