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.sortirbで試してください。たぶん何かがあなたが探しているメソッド名の手がかりを与えるでしょう。
— Ivaylo Strandjev 2013

@IvayloStrandjevそれは役に立ちません。調べるには方法が多すぎます。時間の無駄です。
— さわ2013

@sawaは真実ではありません。30秒かかりました。他のユーザーが私よりも速くても、かなり速いのに十分です。
— Ivaylo Strandjev 2013

8
@checkit:はるかに簡単です!8.methods.grep(/class/)この種のフィルタリングで並べ替える必要すらありません:)
— Sergio Tulentsev 2013

@SergioTulentsev素敵なもの!! それは本当に役に立ちます:)
— Rahul Tapali 2013

回答:



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 2018年

18

オブジェクト(インスタンス化されたクラス)が与えられると、親クラスを派生させることができます

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

16

グーグルがRailsで働いている人をここに連れてくる場合、代わりにあなたが望むかもしれないのはbase_class、superclassActiveRecord継承構造もトラバースすることです。

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に関する限り、「アプリケーション」には使用しているgemが含まれているため、gemで定義されたものをサブクラス化するモデルがある場合はbase_class、gemのクラスが返されます。


8

あなたが探している用語はですsuperclass。そして確かにあなたはB.superclass得るために行うことができますA。(B.ancestors継承元のすべてのクラスとモジュールのリストを取得することもできます—のようなものです[B, A, Object, Kernel, BasicObject]。)


2

継承は、2つのクラス間の関係です。継承により、クラス間に親子関係が作成されます。これはコードの再利用のためのメカニズムであり、パブリッククラスとインターフェイスを介して元のソフトウェアの独立した拡張を可能にします。継承の利点は、階層の下位のクラスが上位のクラスの機能を取得するだけでなく、独自の特定の機能を追加できることです。 。

Rubyでは、クラスは他の1つのクラスからのみ継承できます。(つまり、クラスは、別のクラスから継承する別のクラスから継承するクラスから継承できますが、1つのクラスが一度に多くのクラスから継承することはできません)。BasicObjectクラスは、Rubyのすべてのクラスの親クラスです。したがって、そのメソッドは、明示的にオーバーライドされない限り、すべてのオブジェクトで使用できます。

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

この階層でBasicOjectが見つからない限り、class_name.superclass.nameを使用してトレースし、このプロセスを実行できます。BasicObjectは、すべてのクラスのスーパークラスです。クラスCの階層ツリーを見たいとしましょう。

 C.superclass
   => B
 B.superclass
  => A
 A.superclass
  => Object
 Object.superclass
  => BasicObject

クラスCの階層全体を見ることができます。このアプローチを使用すると、親クラスに含まれている、または先頭に追加されているモジュールは見つかりません。

モジュールを含む完全な階層を見つけるための別のアプローチがあります。Rubyのドキュメントの祖先によると。modに含まれる/追加されるモジュールのリストを返します(mod自体を含む)。

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-ientified_programming)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.