Предположим, у меня есть классы A
и B
где B
наследуется A
. Как напечатать имя родительского класса вB
class A
end
class B < A
end
Кое-что я пробовал
>> B.new.class #=> B #which is correct
>> B.new.parent #=> Undefined method `parent`
>> B.parent #=> Object
>> B.parent.class #=> Class
Благодаря :)
B.methods.sort
irb. Может быть, что-то подскажет, какое имя метода вы ищете.8.methods.grep(/class/)
Вам даже не нужно сортировать с такой фильтрацией :)Ответы:
class A end class B < A end B.superclass # => A B.superclass.name # => "A"
источник
Если вам нужен полный стек предков, попробуйте:
object.class.ancestors
Например:
> a = Array.new => [] > a.class.ancestors => [Array, Enumerable, Object, Kernel, BasicObject]
источник
Array
за ним следуетEnumerable
, что это не родительский элемент, а модуль, включенный в массив . Если вам нужны только классы, вы можете сделать что-то вродеArray.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
.Учитывая объект (экземпляр класса), вы можете получить родительский класс
>> x = B.new >> x.class.superclass.name =>"A"
источник
В случае , если Google приносит кто - нибудь здесь , кто работает в Rails, что вы можете вместо этого
base_class
, так какsuperclass
пересечет структуру наследования ActiveRecord , а также.class A < ActiveRecord::Base end class B < A end > A.superclass => ActiveRecord::Base > B.superclass => A > A.base_class => A > B.base_class => A
Еще больше...
class C < B end > C.base_class => A
Другими словами,
base_class
дает вам верхнюю часть дерева наследования, но ограничивается контекстом вашего приложения. Однако справедливое предупреждение, что касается Rails, «ваше приложение» включает в себя любые используемые вами драгоценные камни, поэтому, если у вас есть модель, которая подклассифицирует что-то определенное в геме,base_class
вернет класс драгоценного камня, а не ваш.источник
Термин, который вы ищете
superclass
. И действительно можно вообщеB.superclass
получитьA
. (Вы такжеB.ancestors
можете получить список всех классов и модулей, от которых он наследуется - что-то вроде[B, A, Object, Kernel, BasicObject]
.)источник
В Ruby класс может наследовать только от одного другого класса. (т.е. класс может наследовать от класса, который наследуется от другого класса, который наследуется от другого класса, но один класс не может наследовать сразу от многих классов). Класс BasicObject является родительским классом для всех классов в Ruby. Следовательно, его методы доступны для всех объектов, если они явно не переопределены.
Попробую пояснить на примере.
module Mux def sam p "I am an module" end end class A include Mux end class B < A end class C < B end class D < A end
Вы можете выполнить трассировку с помощью class_name.superclass.name и выполнить этот процесс, если вы не нашли BasicOject в этой иерархии. BasicObject - это суперкласс для всех классов. Давайте посмотрим, что предположим, что мы хотим увидеть дерево иерархии класса C.
Вы можете увидеть всю иерархию класса C. Обратите внимание, что при таком подходе вы не найдете модулей, которые включены или добавлены в родительские классы.
Есть еще один подход к поиску полной иерархии, включая модули. По словам предков Ruby doc . Возвращает список модулей, включенных / добавленных в мод (включая сам мод).
Здесь Mux и Kernel - это модули.
http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriated_programming)
источник