Ruby DRbObject и переопределение отправки

У меня сегодня была забавная ситуация (упрощенно):

Ive объект связи типа Adapterс #send и #receive метод. Мое приложение связывается с ним по DRb. Так что в моем приложении у меня есть DRbObjectдопустим foo,

Теперь звоню

foo.send(msg, dest)

вызывает #send на DRbObject, вместо Adapter,

Конечно, проще всего было бы переименовать метод send. Но я бы хотел остаться как можно ближе к моей документации / базовому API.

Как вы думаете? Должен ли я переименовать send метод, или есть аккуратный (локальный) взломать для этого?

1 ответ

Решение

DRbObject делает магию удаленной маршрутизации сообщений с #method_missing, Итак, ясно, что мы должны определить #send метод из foo поэтому он будет делегировать #method_missing вместо!

foo.singleton_class.class_eval { undef_method :send }

Или сделать это более объектно-ориентированным способом:

AdapterDRbObject < DRbObject
  undef_method :send
end

Что касается того, должны ли вы сделать это, это для обсуждения.

Это на самом деле "нормально" переопределить / удалить #sendпотому что каждый должен знать, что вы всегда должны звонить #__send__ вместо. (На самом деле, если вы посмотрите на DRbObject#method_missingэто вызывает #__send__.)

С другой стороны, #send является довольно общей концепцией Ruby и может сбить с толку будущих разработчиков кода.

Другие вопросы по тегам