Как я могу изменить этот простой фрагмент Ruby? - PullRequest
0 голосов
/ 14 августа 2010

У меня есть класс, который выглядит следующим образом:

class Base < Library
  prelude "some-value"        # from Library
  def foo; ...; end

  prelude "some-other-value"  # from Library
  def bar; ...; end

  # ... others
end

Я хотел бы преобразовать его в нечто вроде следующего:

class Base < Library
  # what goes here to bring FooSupport and BarSupport in?
end

class FooSupport (< ... inherit from something?)
  prelude "..."   # Need a way to get Library prelude.
  def foo; ...; end
end

class BarSupport (< ... inherit from something?)
  prelude "..."   # Need a way to get Library prelude.
  def bar; ...; end
end

Как я могу это сделать?

1 Ответ

1 голос
/ 14 августа 2010

Что вам нужно, это include. Возможно, вы использовали его раньше в модулях, но он работает и в классах, поскольку Class наследует от Module в Ruby. Поместите ваши методы поддержки в модуль и include в основной класс.

Что касается метода класса prelude, просто вызовите его для объекта, который вы дали в методе included модуля.

base.rb:

require "foo"
require "bar"

class Base < Library
  include FooSupport
  include BarSupport
end

foo.rb:

module FooSupport
  def self.included (klass)
    klass.prelude "..."
  end

  def foo; "..." end
end

Редактировать: Если вам нужно чередовать вызовы prelude и определения методов, вам может понадобиться что-то более похожее на:

module FooSupport
  def self.included (klass)
    klass.class_eval do
      prelude "..."
      def foo; "..." end

      prelude "..."
      def bar; "..." end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...