Rubyにはクラスの概念の一つに「スーパークラス(superclass)」というものがあります。
あまり聞きなれない単語で頭に「?」が浮かぶことも少なくありません。
ここでは、「スーパークラス(superclass)」とは何か?やスーパークラスの確認方法を実例で解説しています。
スーパークラスとは何か?
Rubyでは各要素の型にはクラスがあります。そのクラスの親となっているクラスのことをスーパークラスと呼びます。(上の階層のクラスのこと)
スーパークラスの例
Rubyのクラスの概念がわかりにくいかもしれません。整数型を表すIntegerを例にすると以下のようになっています。
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” | String | Object | Basic Object |
100 | Integer | Numeric | Object |
1.23 | Float | Numeric | Object |
[1, 2, 3] | Array | Object | Basic Object |
1..3 | Range | Object | Basic Object |
{:a=>1, :b=>2, :c=>3} | Hash | Object | Basic Object |
クラス | Class | Object | Basic Object |
モジュール | Module | Object | Basic Object |
nil | NilClass | Object | Basic 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