Vamos supor que eu tenha classes A
e B
onde B
herde A
. Como faço para imprimir o nome da classe pai emB
class A
end
class B < A
end
Algumas coisas eu tentei
>> B.new.class #=> B #which is correct
>> B.new.parent #=> Undefined method `parent`
>> B.parent #=> Object
>> B.parent.class #=> Class
Obrigado :)
B.methods.sort
no irb. Talvez algo lhe dê uma pista sobre o nome do método que você procura.8.methods.grep(/class/)
Você nem precisa classificar com este tipo de filtro :)Respostas:
class A end class B < A end B.superclass # => A B.superclass.name # => "A"
fonte
Se você quiser a pilha ancestral completa, tente:
object.class.ancestors
Por exemplo:
> a = Array.new => [] > a.class.ancestors => [Array, Enumerable, Object, Kernel, BasicObject]
fonte
Array
seguido porEnumerable
, que não é um pai, mas um módulo incluído no Array . Se você quiser apenas as aulas, pode fazer algo comoArray.ancestors.select { |ancestor| ancestor.is_a? Class } #=> [Array, Object, BasicObject]
.Dado um objeto (classe instanciada), você pode derivar a classe pai
>> x = B.new >> x.class.superclass.name =>"A"
fonte
No caso do google trazer aqui alguém que está trabalhando em Rails, o que você pode querer é
base_class
, poissuperclass
irá percorrer a estrutura de herança do ActiveRecord também.class A < ActiveRecord::Base end class B < A end > A.superclass => ActiveRecord::Base > B.superclass => A > A.base_class => A > B.base_class => A
Ainda mais ...
class C < B end > C.base_class => A
Em outras palavras,
base_class
fornece o topo da árvore de herança, mas limitado ao contexto de seu aplicativo. Porém, um aviso justo, no que diz respeito ao Rails, "sua aplicação" inclui quaisquer gemas que você esteja usando, então se você tiver um modelo que subclasse algo definido em uma gema,base_class
retornará a classe da gema, não a sua.fonte
O termo que você está procurando é
superclass
. E de fato você pode fazerB.superclass
para conseguirA
. (Você também pode fazerB.ancestors
para obter uma lista de todas as classes e módulos dos quais ele herda - algo como[B, A, Object, Kernel, BasicObject]
.)fonte
Em Ruby, uma classe só pode herdar de uma única outra classe. (ou seja, uma classe pode herdar de uma classe que herda de outra classe que herda de outra classe, mas uma única classe não pode herdar de muitas classes de uma vez). A classe BasicObject é a classe pai de todas as classes em Ruby. Seus métodos estão, portanto, disponíveis para todos os objetos, a menos que sejam explicitamente substituídos.
Vou tentar explicar com um exemplo.
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
Você pode rastrear usando class_name.superclass.name e fazer este processo, a menos que tenha encontrado BasicOject nesta hierarquia. BasicObject é superclasse para todas as classes. vamos supor que queremos ver a árvore hierárquica da classe C.
Você pode ver toda a hierarquia da classe C. É importante observar que, ao usar essa abordagem, você não encontrará módulos incluídos ou anexados nas classes pai.
Existe outra abordagem para encontrar a hierarquia completa, incluindo módulos. De acordo com ancestrais Ruby doc . Retorna uma lista de módulos incluídos / prefixados no mod (incluindo o próprio mod).
Aqui, Mux e Kernel são Módulos.
http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
fonte