Ruby получает наследующий класс

Я работаю над созданием моего первого плагина для направляющих. Я все еще довольно плохо знаком с рубином, и я задавался вопросом если его возможное для получения наследующего класса?

Например, я пытаюсь создать плагин, который позволит поблочное тестирование и функциональное тестирование, когда Вы не будете использовать миграции. То, что я пытаюсь сделать, инициализируют переменную класса, названную контроллером, который будет инициализирован к типу контроллера, который тестируется.

Если у меня есть базовый класс ControllerTest:

class ControllerTest < Test::Unit::TestCase
  attr_accessor :controller

  def initialize
    super
    @controller = "call function that will find the inheriting classes name and create an instance of that controller type."
  end
end

Таким образом, то, на чем я в настоящее время застреваю, получает название наследующего класса. Действительно ли это возможно? И в противном случае кто-либо знает иначе о том, как я мог пойти о реализации этого?

Заранее спасибо.

5
задан Brian DiCasa 11 April 2010 в 00:54
поделиться

3 ответа

Если вы хотите получить имя класса, в котором вы сейчас участвуете, вы можете использовать self.class.name . Если вы хотите получить суперклассы, вы можете использовать массив self.class.ancestors , например self.class.ancestors [1] .name . Непосредственный суперкласс также доступен как self.superclass .

Правка, добавленный пример:

class ControllerTest
  attr_accessor :controller
  def initialize
    super
    @controller = eval "#{self.class.name}Controller.new(self)"
  end
end

class Foo <ControllerTest
end
class Bar <ControllerTest
end

class Controller
  def initialize (o)
    puts "Created #{self.class} to control #{o.class.name}"
  end
end

class FooController <Controller
end
class BarController <Controller
end

foo = Foo.new
bar = Bar.new

Это выводит

Created FooController to control Foo
Created BarController to control Bar
9
ответ дан 18 December 2019 в 09:06
поделиться

Я полагаю, вам нужно будет перехватывать классы по мере их определения...

Из RDoc для класса Class:

inherited(subclass)
Callback invoked whenever a subclass of the current class is created.

Example:

   class Foo
      def self.inherited(subclass)
         puts "New subclass: #{subclass}"
      end
   end

   class Bar < Foo
   end

   class Baz < Bar
   end
produces:

   New subclass: Bar
   New subclass: Baz
0
ответ дан 18 December 2019 в 09:06
поделиться

Очень просто: используйте "унаследованный" обратный вызов.

Из RDoc для класса Class: inherited(subclass): Обратный вызов, вызываемый всякий раз, когда создается подкласс текущего класса.

Example:

   class Foo
      def self.inherited(subclass)
         puts "New subclass: #{subclass}"
      end
   end

   class Bar < Foo
   end

   class Baz < Bar
   end
produces:

   New subclass: Bar
   New subclass: Baz

http://ruby-doc.org/core/classes/Class.html#M002785

9
ответ дан 18 December 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: