Если я правильно понимаю, вы хотите вернуть экземпляр Example
при вызове экземпляра ExamplePresenter
. Такого прямого механизма не существует ни в одном языке, и даже если бы он существовал, он заблокировал бы весь доступ к экземпляру ExamplePresenter
и его методам. Так что это не логично.
Однако вы можете кое-что сделать. Вы можете создать методы делегата класса ExamplePresenter
для экземпляра Example
внутри него. По сути, вы не получаете реальное Example
от @presenter
, но вы получаете ExamplePresenter
, который передает все подходящие методы в свой внутренний Example
, эффективно действующий от его имени.
Некоторые способы сделать это:
method_missing
class ExamplePresenter
… # as defined in the question
def method_missing symbol, *args
if @example.respond_to?(symbol)
@example.send(symbol, *args)
else
super
end
end
end
Это передаст любой вызов метода внутреннему Example
, если ExamplePresenter
не сможет ответить на него. Будьте осторожны, вы можете выставить больше, чем вы хотите, для внутреннего Example
таким образом, и любой метод, уже определенный в ExamplePresenter
, не может быть передан.
Вы можете использовать дополнительную логику внутри method_missing
для ограничения экспозиции или предварительной / последующей обработки аргументов / возвращаемых значений.
Методы обертки
Вы можете определить методы-оболочки в ExamplePresenter
, которые ничего не делают, но передают все во внутренний Example
. Это дает вам явный контроль над тем, сколько из этого вы хотите выставить.
class ExamplePresenter
… # as before
def a_method
@example.a_method
end
def another_method(argument, another_argument)
@example.another_method(argument, another_argument)
end
end
Это становится утомительно быстро, но вы также можете добавить логику для изменения аргументов перед передачей их в Example
или последующей обработкой результатов.
Вы также можете смешивать и сочетать два вышеуказанных метода
В Ruby stdlib есть библиотека с именем Делегатор , созданная специально для этой цели. Вы можете посмотреть на это.