Rubyはオブジェクト指向プログラミング言語であり、オブジェクトというものをわからなければRubyを正しく理解することはできない。なので、オプジェクト指向とオプジェクトの一般的な概念になるクラスやモジュールをまとめてみる。
オブジェクト指向とは
Ruby, Java, Pythonなどはオブジェクト指向言語というものに分類されている。オブジェクトというものは具体的に識別できるものならなんでもオブジェクトなれる。例えば、文字列、数値、時刻など全てのデータがオブジェクトとして扱われる。"hello, world"とか"object"は文字列オブジェクト、1や3.14などは数値オブジェクトと呼ばれる。
また、オブジェクトはメソッドを通して何かの行動ができる。オブジェクトのメソッドを実行するには下記のようなコードを使う。
1
|
|
クラス、インスタンス
クラスとはオブジェクトの種類を表したものである。Rubyのオブジェクトは必ずクラスに属している。オブジェクトがどんなクラスに属しているかを確認するためには下記のように.class
メソッドを使って調べる。
1 2 |
|
このクラスというものは設計図になるとしたら、インスタンスはその設計図を使って実際に作り出すものになる。つまり、インスタンスはクラスを具体化したものだということ。そして全てのオブジェクトはあるクラスのインスタンスだとも言える。
実際に使ってみる
1 2 3 4 5 6 7 8 |
|
説明すると
- クラスを定義する
1 2 3 |
|
- メソッドを定義する
1 2 3 |
|
- インスタンスを作成
1
|
|
newメソッドを用いることでインスタンスを作成できる。
モジュール
まず、コンソールで試してみたら
1 2 3 4 5 |
|
モジュールはクラスのスーパークラスということをわかる。
クラスとモジュールの違いは、リファレンスマニュアルを見ると、こう書かれてる。
クラスとモジュールには
- クラスはインスタンスを作成できるが、モジュールはできない。
- モジュールを他のモジュールやクラスにインクルードすることはできるが,クラスをインクルードすることはできない。
という違いがありますが、それ以外のほとんどの機能は Module から継 承されています。Module のメソッドのうち
- Module#module_function
- Module#extend_object
- Module#append_features
- Module#prepend_features
- Module#refine
は Class では未定義にされています。
class Class - Ruby 2.3.0 リファレンスマニュアル
上記の特性を見ると、モジュールはあくまでクラスの機能を補助(拡張)するものというイメージ。
下記は一番シンプルな例。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Rubyでのモジュールの役割
大きく二つの役割がある
- Mix-in
- Namespace
Mix-in
クラスやモジュールにモジュールをインクルードすることをMix-in
と呼ぶ。
Rubyのクラスは多重継承できないが、Mix-in
なら複数のモジュールをインクルードすることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Namespace
クラス定義をモジュールで囲むことで、Namespace
として利用できる。異なるNamespace
であれば、同名のクラスも定義できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
優先順位
インクルードしたモジュールにスーパークラスと同名のメソッドが定義されていた場合、モジュールが優先される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
複数のモジュールをインクルードした場合は、後でインクルードしたモジュールのメソッドが優先。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|