Як отримати назву класу батьків у Ruby


85

Припустимо, у мене є класи 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

Дякую :)


4
коли застряєш так, завжди намагайся B.methods.sortв irb. Можливо, щось підкаже вам назву методу, який ви шукаєте.
Івайло Страндж

@IvayloStrandjev Це не допоможе. Існує занадто багато методів, які потрібно переглянути. Це марна трата часу.
sawa

@sawa не відповідає дійсності. У мене 30 секунд. Досить, щоб інші користувачі були швидшими за мене, але досить швидкими.
Івайло Страндж

8
@checkit: набагато простіше! 8.methods.grep(/class/)Вам навіть не потрібно сортувати за допомогою такого роду фільтрації :)
Серхіо Туленцев

@SergioTulentsev приємний !! це буде дуже корисно :)
Рахул Тапалі

Відповіді:



62

Якщо вам потрібен повний стек предків, спробуйте:

object.class.ancestors

Наприклад:

> a = Array.new
=> []
> a.class.ancestors
=> [Array, Enumerable, Object, Kernel, BasicObject]

1
Майте на увазі, що це також включає модулі, включені до класу. Ви можете бачити, Arrayза яким слідує Enumerable, який не є батьківським, а модулем, що входить до масиву . Якщо ви хочете лише класи, ви можете зробити щось подібне Array.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject].
3limin4t0r

18

Враховуючи об’єкт (Instantiated Class), ви можете отримати батьківський клас

>> x = B.new
>> x.class.superclass.name
=>"A"

16

Якщо 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поверне клас, не ваш.


8

Термін, який ви шукаєте, - це superclass. І справді ви можете зробити, B.superclassщоб отримати A. (Ви також можете зробити, B.ancestorsщоб отримати список усіх класів і модулів, які він успадковує - щось на зразок [B, A, Object, Kernel, BasicObject].)


2

Спадщина - це відношення між двома класами. Спадщина створює батьківські дочірні стосунки між класами. Це механізм для повторного використання коду та дозволу незалежних розширень оригінального програмного забезпечення через загальнодоступні класи та інтерфейси. Перевага успадкування полягає в тому, що класи, розташовані нижче в ієрархії, отримують функції тих, що знаходяться вище, але також можуть додавати свої власні особливості .

У 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.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

Ви можете бачити всю ієрархію класу C. Зауважте, що за допомогою цього підходу ви не знайдете модулів, які включені або додані до батьківських класів.

Існує інший підхід до пошуку повної ієрархії, включаючи модулі. На думку предків Рубі-дока . Повертає список модулів, включених / доданих до мода (включаючи сам мод).

C.ancestors
 => [C, B, A, Mux, Object, Kernel, BasicObject]

Тут Mux і Kernel - це модулі.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.