この章では、オブジェクトモデルとメソッドについて基礎的、そして重要なことが多く述べられています。
それを今回はアウトプットを兼ねて紹介していこうとおもいます。
※この記事ではメソッドという言葉が出てきますが、原則としてインスタンスメソッドを指します。
クラスメソッドを指す時は、明示して記述します。
オブジェクトの中身
インスタンス変数
まずは以下のコードを見てください。
class Example
def ex_method
@ex = 1
end
end
obj = Example.new
obj.class # => Example
ここで大事なのが、インスタンス変数はオブジェクトに含まれているということです。
実際に確かめてみましょう
obj.ex_method
obj.instance_variables #=> [:@ex]
メソッド
オブジェクトはメソッドも持っています。そして同じクラスを持っているオブジェクトはメソッドも共通している。要は、メソッドは、オブジェクトではなく、クラスに存在しているんです。
これは、見ればわかりますよね。
class Example
def ex_method
@ex = 1
end
end
この書き方からも分かる通り、メソッドはクラスに存在しています。
クラスの中身
ここで大事なことを述べます。一番大事なのは、
クラスはオブジェクトであるということです。
クラスはオブジェクトである、といわれてもピンとこない方がいらっしゃるかもしれませんので、実際に確かめてみましょう。
ぼくらがよく知っているArrayクラス、Stringクラスを例に見てましょう
Array.class #=> Class
String.class #=> Class
つまり、StringクラスやArrayクラスは、Classクラスのオブジェクトであるということが言えます。
「メソッド」の部分でも述べたように、オブジェクトでのメソッドは、そのクラスのインスタンスメソッドです。
ということは、クラスのメソッドは、Classクラスのインスタンスメソッドです。
実際に確かめてみましょう。
Class.instance_methods(false) #=> [:new, :allocate, :superclass]
クラスを生成する際に使われるnewメソッドは実は、Classクラスのインスタンスメソッドだったんです。
モジュール
では、Classクラスの親クラスは何なのでしょうか?
Class.superclass #=> Module
個人的にこの章で驚いたのが、Classクラスの親クラスはModuleだったことです。このことから、すべてのクラスはModuleであることが分かるんです。
そして、ClassやModuleは定数なんです。
定数について
定数は大文字で始まるものです。そのためModuleやClassは定数といえるんです。
定数の特徴は独自のルールに従っているんですね。以下の例を見てください
Module MyModule
MyConstant = "外側にある定数"
class Myclass
MyConstant = "内側にある定数"
end
end
ディレクトリ構造で示すとこのような形になります。
MyModule/MyConstant
MyModule/MyClass/MyConstant
同じ名前のMyConstantでも入っている値は違います。ディレクトリ構造に似ていますね。
このようにネストできる定数を1個に特定できます。その際にはコロン2個使います。
実際に書いてみましょう
module M
Constant = "外側にある定数"
class Example
Constant = "内側にある定数"
end
end
M::Constant #=> "外側にある定数"
M::Example::Constant #=> "内側にある定数"
オブジェクトとクラスをまとめてみる
オブジェクトとは、インスタンス変数の集合体で、クラスとつながっているものです。
クラスとは、Classクラスのオブジェクト(インスタンス)であり、そこにインスタンスメソッドがあり、親クラスがあるものです。
そしてClassクラスはModuleクラスの子クラスです。
個人的な感想ですが、オブジェクトを言葉で説明しようとすると結構難しいとおもいます。
抽象的概念だし、rubyにおいてはあらゆるものがオブジェクトだからです。
以上です。何か間違いがございましたら、ご教示いただけますと幸いです。
【参考文献】