【Ruby】スーパークラスとは何か?確認方法や使い方を実例で解説(superclass)

ruby-prograshi(プロぐらし)-kv ruby
記事内に広告が含まれていることがあります。

Rubyにはクラスの概念の一つに「スーパークラス(superclass)」というものがあります。

あまり聞きなれない単語で頭に「?」が浮かぶことも少なくありません。

ここでは、「スーパークラス(superclass)」とは何か?やスーパークラスの確認方法を実例で解説しています。


スーパークラスとは何か?

Rubyでは各要素の型にはクラスがあります。そのクラスの親となっているクラスのことをスーパークラスと呼びます。(上の階層のクラスのこと)


スーパークラスの例

Rubyのクラスの概念がわかりにくいかもしれません。整数型を表すIntegerを例にすると以下のようになっています。

スーパークラスの例
  • 整数1のクラス(型)は「Integer」。
  • 「Integer」のスーパークラスは、数字全般を表す「Numeric」。
  • 「Numeric」のスーパークラスは、データ全般を表す「Object」。
  • 「Object」のスーパークラスは、識別やメソッドの指定など基本機能だけをもつ「BasicObject」。これが最上位のクラス。

Rubyにおける型のクラスの構造を図にすると以下のようになります。

BasicObject(最上位のクラス)
  ↓
Object
  ↓
String, Numeric, Module, Class,,,
           ↓
     Integer, Float


スーパークラスの確認方法(superclassメソッド)

スーパークラスを確認するメソッドに「superclass」があります。これを実行すると、親となるクラス(スーパークラス)を表示してくれます。

型.superclass


実例

p Integer.superclass

//出力
Numeric
p BasicObject.superclass
p Object.superclass
p Numeric.superclass
p Integer.superclass

//出力
nil
BasicObject
Object
Numeric


BasicObjectが最上位のクラス

型の中で全ての型が属する最上位のクラスは「BasicObject」です。

このため「BasicObject」に対してsuperclassメソッドを実行すると、結果は「nil」となります。

p BasicObject.superclass

//出力
nil


各要素の型(クラス)とスーパークラスの関係

主要な要素とその型(クラス)とスーパークラスの関係は以下のようになっています。

要素型(クラス)スーパークラススーパークラスのスーパークラス
“string”StringObjectBasic Object
100IntegerNumericObject
1.23FloatNumericObject
[1, 2, 3]ArrayObjectBasic Object
1..3RangeObjectBasic Object
{:a=>1, :b=>2, :c=>3}HashObjectBasic Object
クラスClassObjectBasic Object
モジュールModuleObjectBasic Object
nilNilClassObjectBasic Object


スーパークラスをどこで使うか?

スーパークラスの概念がどこで必要になるかというと、主な例では、is_a?メソッドがあります。

is_a?メソッドとは何か?

is_a?とは引数で型を指定し、指定した型にあっていればtrue、違えばfalseを返すメソッドです。

レシーバ.is_a?(型)

このis_a?は単に指定した要素の型を判断するだけでなく、指定した型がスーパークラスの場合でもtrueを返します。

is_a?の実例(通常の使い方)

arr = [1, 2, 3]

arr.is_a?(Array)
=> true

arr.is_a?(String)
=> false

配列に対して、型「Array」を引数に渡せばtrueが返ります。「String」を渡せば、falseが返ります。


is_a?の実例(スーパークラスを指定した場合)

arr = [1, 2, 3]

arr.is_a?(Object)
=> true

配列型の要素に対して「Array」ではなく、「Object」を指定した場合もtrueが返っていることがわかります。


is_a?使用時の注意点

参考に、is_a?メソッド使用時の注意点を記載しておきます。

上位のクラスを指定するとtrueが返る

is_a?メソッドの引数にスーパークラスを指定した場合もtrueになるため、全てのデータが該当するObjectやBasic Objectを指定するとtrueが返ってしまいます。

obj = {:a=>1, :b=>2, :c=>3}
obj.is_a?(BasicObject)
=> true

100.is_a?(BasicObject)
=> true

"文字列".is_a?(BasicObject)
=> true



クラス名を指定するとfalseになる

is_a?は引数でクラス(型)を指定するものです。仮に、クラス名を指定した場合はfalseとなってしまうので注意してください。

class Aaa
end

##クラスの継承
class Bbb < Aaa
end

##クラス名を指定するとfalseになる
Bbb.is_a?(Bbb)
=> false

##スーパークラスのクラス名を指定するとfalseになる
Bbb.is_a?(Aaa)
=> false

##型を指定すればtrueが返る
Bbb.is_a?(Class)
=> true



タイトルとURLをコピーしました