Сквозные Методы - PullRequest
       27

Сквозные Методы

2 голосов
/ 09 февраля 2010

Кто-нибудь знает способ предоставления сквозных методов для обеспечения чего-то вроде следующего, но с добавленным DRY?

class Cover

  @some_class = SomeClass.new

  def some_method
    @some_class.some_method
  end

end

в идеале я бы хотел высушить что-то вроде этого:

class Cover

  @some_class = SomeClass.new
  passthrough @some_class.some_method

end

без обезьяны-залатывания жизни от себя, есть ли что-нибудь, что есть у людей?

Приветствия

Roja

Ответы [ 4 ]

8 голосов
/ 09 февраля 2010

Поддержка шаблона делегирования


Делегат


Помогает ли Делегат здесь?Он позволяет делегировать методы второму классу

Эта библиотека предоставляет три различных способа делегировать вызовы методов для объекта.Самым простым в использовании является SimpleDelegator.Передайте объект в конструктор, и все методы, поддерживаемые объектом, будут делегированы.Этот объект может быть изменен позже.

Продвигаясь дальше, метод DelegateClass верхнего уровня позволяет легко настроить делегирование посредством наследования классов.Это значительно более гибко и, таким образом, возможно, является наиболее распространенным использованием этой библиотеки.

Наконец, если вам нужен полный контроль над схемой делегирования, вы можете наследовать от абстрактного класса Delegator и настраивать по мере необходимости.(Если вам нужен этот элемент управления, посмотрите на forwardable, также в стандартной библиотеке. Он может лучше удовлетворить ваши потребности.)


Forwardable


Существует также библиотека forwardable

Эта библиотека позволяет делегировать вызовы метода для объекта на основе метода.Вы можете использовать Forwardable для настройки этого делегирования на уровне класса или SingleForwardable для его обработки на уровне объекта.

2 голосов
/ 09 февраля 2010

Forwadable , вероятно, то, что вы хотите:

class Cover
  extend Forwardable

  def initialize
     @some_class = SomeClass.new
  end

  def_delegator @some_class, :some_method

end

Forwardable работает на уровне класса, но вы также можете использовать SingleForwardable для делегирования на уровне объекта.

0 голосов
/ 10 февраля 2010

Вы можете переопределить ядро ​​method_missing примерно так:

class Bar
  def method_missing(method, *args)
    @delegate.send(method, *args) if @delegate.respond_to? method
  end
end
0 голосов
/ 10 февраля 2010

Два пути, один чистый рубин, один рельс.

Ruby: def_delegator от Переадресация http://ruby -doc.org / STDLIB / libdoc / пересылаемый / RDoc / классы / Forwardable.html

Rails: делегат http://api.rubyonrails.org/classes/Module.html#M000110

...