LINUX.ORG.RU

Ruby: message passing


0

0

Message passing, not function calls

A method call is really a message to another object:

# This
1 + 2
# Is the same as this ...
1.+(2)
# Which is the same as this:
1.send "+", 2

Объясните, плс, сакральный смысл. Вроде как, понимаю, что 1 это тоже самое, что 2 и тоже самое, что 3, но в голове никак не устаканится, что же такое сообщения. Со SmallTalk я не знаком, это, вероятно, оттуда. Короче, в чём разница между вызовом функций и посылом сообщений?

★★★

Это вобщем то не более чем, описание идеи.
Можно сказать я вызвал метод класса а под названием +.
А можно сказать я послал объекту а сообщение +.
Суть не особо меняется. Хотя в чем то нотация сообщений
понятнее.

Svoloch ★★★
()

А нет никакой разницы, хотя отправка сообщений могла бы быть асинхронной...

const86 ★★★★★
()

Разница в том, что при вызове функции заранее известен её адрес, а при посылке сообщения адрес вычисляется в рантайме и зависит от объекта (его типа, положения в иерархии наследования и т.п.). Но я думаю вы и так это знаете. А разница между "методом" и "сообщением" терминологическая в основном. Хотя есть нюансы, в том же C++ метод может означать очень разные вещи. Так что "сообщение" - более корректный термин при описании семантики Руби.

Hjorn
()
Ответ на: комментарий от Hjorn

> при посылке сообщения адрес вычисляется в рантайме и зависит от объекта

В питоне как раз так, но называют методами. А в ObjC может вычисляться компилятором, но всё равно сообщением зовётся.

const86 ★★★★★
()
Ответ на: комментарий от const86

Это от того, что в ООП нет строго определенной терминологии. Каждый понимает и трактует как хочет.

Hjorn
()

> в чём разница между вызовом функций и посылом сообщений?

Если не углубляться в дебри, то посылка сообщения - это поиск функции в ассоциативном массиве и ее вызов. Т.е. никакой разницы :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> посылка сообщения - это поиск функции

> Т.е. никакой разницы

Да уж, совсем никакой :)

Hjorn
()
Ответ на: комментарий от tailgunner

А в чем профит собсно такой техники? Оно же тормозит. Haskell например умеет compile time определять адреса нужных функций. И работает он на два порядка быстрее.

dizza ★★★★★
()
Ответ на: комментарий от dizza

> А в чем профит собсно такой техники? Оно же тормозит

Это холиворный вопрос %) Такая техника проста в реализации и вообще типична для динамически типизированных ОО-языков. То есть, вместо тго, чтобы писать сложный компилятор с нормальными проверками типов, все проверки сваливают на рантайм.

> Haskell например умеет compile time определять адреса нужных функций.

Во-первых, Хаскелл статически типизированный; во-вторых, вряд ли его compile-time способности относятся к ООП :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Его и Си++ умеет, без всякого поиска в таблицах :)

ЩИТО?

man позднее связывание!!1

При позднем связывании адреса определяются динамически во время выполнения программы, а не статически во время компиляции, как в традиционных компилируемых языках, в которых применяется раннее связывание. Сам процесс связывания заключается в замене виртуальных функций на адреса памяти.
zh
()

>Короче, в чём разница между вызовом функций и посылом сообщений?

Поправьте если не прав, но посылка сообщений - это *одна из техник* вызова функций, более унифицированная и как правило использующая рефлексию языка для поиска нужных методов и объектов. В самом сообщении находится информация о маршруте ( имя/типа объекта и слота ) и параметры метода. Такая техника удобна в некоторых случаях, и позволяет, например, широковещательные сообщения. В том же руби:

ObjectSpace.each_object(Enumerable) { |i| puts i.length }

Код проходится по всем объектам из иерархии ( в данном случае, по всем объектом, включающим модуль Enumerable, то есть всем, по которым можно итерировать ) и выполняет блок.

volh ★★
()
Ответ на: комментарий от zh

> Virtual Method Table

> Table.

Ассоциативная? :D

>> Его и Си++ умеет, без всякого поиска в таблицах :)

> фэйл.

Утипути :) Фэйлом может закончиться поиск в ассоциативном массиве методов Руби (Питона, Смолтока, ...). А в VTBL даже и поиска нет - обращение по гарантированно существующему индексу.

> уйди.

Только после того, как ты уйдешь учиться читать :D

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

я как раз прочитал ровно то, что ты написал. ты писать научись, если хочешь, что бы тебя понимали. или нормально писать научат только в следующей четверти?

zh
()
Ответ на: комментарий от tailgunner

> Фэйлом может закончиться поиск в ассоциативном массиве методов Руби (Питона, Смолтока, ...).

вот тут, на самом деле, поржал. =) не потому что фигня (нет), а потому что написано смешно =)

zh
()
Ответ на: комментарий от zh

> я как раз прочитал ровно то, что ты написал.

Так ты мне не ответил - является ли VTBL (или VMT, если хочешь) ассоциативным массивом? И может ли "поиск" метода в ней завершиться неудачно?

> ты писать научись, если хочешь, что бы тебя понимали

По-моему, меня только ты и не понял :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> Так ты мне не ответил - является ли VTBL (или VMT, если хочешь) ассоциативным массивом? И может ли "поиск" метода в ней завершиться неудачно?

это уже дело десятое. таблица? таблица. а ты говорил, без таблиц =)

zh
()
Ответ на: комментарий от tailgunner

> А в VTBL даже и поиска нет - обращение по гарантированно существующему индексу.

Ну концептуально большой разницы то нет. Решение что именно вызывать принимается в рантайме.

Hjorn
()
Ответ на: комментарий от zh

> "вытаскивание" по индексу - частный случай поиска.

При поиске есть хоть одно сравнение ключей. В случае VTBL его нет, поэтому вызов через VTBL по определению быстрее.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> вызов через VTBL по определению быстрее.

да кто ж спорит-то? =)

zh
()

Да в общем-то никакой разницы. Простио посылая сообщение, ты можешь указать параметром имя метода, к примеру:

irb(main):001:0> 1.send gets.strip, 2
+
=> 3
irb(main):002:0> 1.send gets.strip, 2
-
=> -1

smh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.