Скажем, у меня есть класс Caller
, который вызывает методы другого класса (т.е. Abc
) в рубине:Украшать все методы класса
class Caller
def run
abc = Abc.new
abc.method1
abc.method2
end
end
class Abc
def method1
puts 'Method1 etc'
end
def method2
puts 'Method2 etc'
end
end
caller = Caller.new
caller.run
Каждый раз, когда метод в классе Abc
называется, мне нужно, чтобы украсить вызов с префиксом, который показывает имя метода и имя метода Calling
Например в приведенном выше примере мне нужен следующий результат:
Caller.run - Method1 etc
Caller.run - Method2 etc
Каков наилучший способ сделать это в рубине?
Это скорее прокси-сервер, не так ли? В любом случае activesupport предоставляет 'ActiveSupport :: BasicObject' как базовый класс для создания прокси. стоит посмотреть на –
Это чисто-рубиновый подход. Существует также 'SimpleDelegator' в stdlib, который может служить аналогичной цели. – samuil
В отличие от прокси-сервера и шаблона делегирования - эти соглашения об именах исходят из статически типизированных языков, где они должны быть реализованы совершенно иначе. Ruby гибкая система набора текста делает многие из этих шаблонов устаревшими, так как идентичное поведение может быть реализовано многими способами. – samuil