個人メモです。
レシーバのクラス(型)を参照する、class
および、親のクラスを確認するsuperclass
またBasicObject
についても。
##目次
##1 .class
.class
メソッドを使うと、レシーバのクラス(型)を簡単に取得することができる。
x = 100
x.class
=> Integer
str = "text"
str.class
=> String
obj = {:a=>1, :b=>2, :c=>3}
obj.class
=> Hash
arr = [1, 2, 3]
arr.class
=> Array
nil.class
=> NilClass
(1..4).class
=> Range
(1.23).class
=> Float
Class.class
=> Class
Class
は名前のないクラス。メタクラスと呼ぶ。
class クラス名 end
で生成するクラスはこのClass
を持っている。
class TestClass
def hello
msg = "test class"
p "hello #{msg}"
end
end
TestClass.class
=> Class
Kernel.class
=> Module
Kernel
はすべてのクラスから参照できるメソッドを定義しているモジュール。
module TestModule
def helloModule
p "hello Module"
end
end
TestModule.class
=> Module
##2 .superclass superclassメソッドを使うとスーパークラスを参照することができる。
数値、文字列、配列、ハッシュ、nil、moduleなどの要素に対しては使えない。
class
メソッドで取得した型に対してなら使用できる。
###スーパークラスとは?
親クラスのことをスーパークラスと呼ぶ。
class AAA
end
#クラスAAAを継承
class BBB < AAA
end
上記のようにクラスを継承した場合、親となるクラスAAAがスーパークラスとなる。
BBBをサブクラスと呼ぶ。
・class サブクラス名 < スーパークラス名
###Numericの場合
100.class
=> Integer
100.class.superclass
=> Numeric
100.class.superclass.superclass
=> Object
100.class.superclass.superclass.superclass
=> BasicObject
100.class.superclass.superclass.superclass.superclass
=> nil
IntegerのsuperclassはNumeric。
NumericのsuperclassはObject。
#数値に使うとエラー
100.superclass
NoMethodError (undefined method `superclass' for 100:Integer)
###classの場合
class Aaa
end
Aaa.class
=> Class
Aaa.superclass
=> Object
ClassのsuperclassはObjectが返る。
###継承した場合
class Aaa
end
class Bbb < Aaa
end
BBB.superclass
=> Aaa
###moduleの場合
moduleに対してsuperclassは使えない。
module Xxx
end
Xxx.class
=> Module
Xxx.superclass
=> NoMethodError (undefined method 'superclass' for Xxx:Module)
##3 .BasicObject BasicObjectとはクラスの最上位概念。 クラスの識別やメソッド呼び出しなど必要最低限の機能を持ったクラスのこと。
BasicObject
↓
Object
↓
String, Numeric, Module, Class,,,
↓
Integer, Floot
RubyではすべてのデータをObjectと呼び、その下に文字列のStringや数値のNumericなどのくくりがある。
上にいくほどより抽象的でシンプルな定義になる。 BasciObjectはその際たるクラス。
BasicObjectのスーパークラスはnilとなる。
BasicObject.superclass
=> nil