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 и может сбить с толку будущих разработчиков кода.