Ruby наследует класс

113
17

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


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


Если у меня есть базовый класс 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


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


Спасибо заранее.

спросил(а) 2021-01-19T19:06:53+03:00 9 месяцев, 1 неделя назад
1
Решение
144

Если вы хотите получить имя класса, в котором вы сейчас находитесь, вы можете использовать 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

ответил(а) 2021-01-19T19:06:53+03:00 9 месяцев, 1 неделя назад
145

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


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


Пример:

   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

ответил(а) 2021-01-19T19:06:53+03:00 9 месяцев, 1 неделя назад
46

Здесь будут перечислены только методы экземпляра в текущем классе


self.class.new.methods - self.class.ancestors [1].new.methods



И общее решение
c = some_class


c.new.methods - c.ancestors [1].new.methods


ответил(а) 2021-01-19T19:06:53+03:00 9 месяцев, 1 неделя назад
47

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


В 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

ответил(а) 2021-01-19T19:06:53+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема