どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

Ruby入門 part9

引き続きRuby入門やっていきます!
「クラスとモジュール」の後半です。

目次

1.アクセス制御

前回のクラスとモジュールの前半では、クラスの定義の方法などを学びました。
また、別の記事(メソッド)では、メソッドの定義の方法などを学びました!
通常、クラス内にメソッドを定義して、そのクラスから作成されたオブジェクトから、定義したメソッドを実行します。
また、オブジェクトからではなく、クラス内の別のメソッドから実行されるメソッドというものを定義することもあります。
このとき、メソッドが誤ってオブジェクトから実行されないように、メソッド毎にアクセス制御レベルを設定することができます✨
オブジェクトからインスタンスメソッドとして実行可能なメソッドにはpublicを指定し、クラス内の別のメソッドからのみ実行可能なメソッドにはprivateを指定します。
方法としては、例えばpublicを指定するなら、以下のように書きます。

public :メソッド名

書く位置は、クラス内にメソッドを定義した直後が良いと思います😊
アクセス制御を指定しない場合は、publicとして扱われます。
ただし、initializeメソッドは常にprivateとなっています。
initializeについては、Ruby入門 part8インスタンスメソッドのあたりでちらっと出てきましたね〜👀

試しにプログラム書いてみました。
gist.github.com
publicに設定したacceleメソッドは、実行すると2行の文字列が出力されます。
一方、privateに設定したcalcSpeedメソッドは、クラス内の別のメソッド(ここではacceleメソッド)から呼び出して実行することはできていますが、オブジェクトから実行しようとするとエラーになります🙃
実行結果は以下のようになります。
f:id:mistyrinth:20181127151639p:plain

また、複数のメソッドに対して、まとめてアクセス制御を設定することもできます。

方法は、:メソッド名の部分を取り除き、publicの1行だけを記述すると、それ以降に定義されたメソッドは全てpublicに設定されることとなります👌
同様にprivateの1行だけを記述すると、それ以降に定義されたメソッドは全てprivateに設定されます。

2.モジュール

クラスによく似たものとして、モジュールというものがあります。
モジュールは以下のように定義します。

module モジュール名

end

モジュールもクラスと同じく、メソッドを定義することができます!
ただし、クラスはクラスからオブジェクトを作成することができるのに対して、モジュールではオブジェクトを作成することができない点が挙げられます。
ここがクラスとモジュールの大きな違いですね〜😗

モジュールの利用方法としては、モジュール名.メソッド名のようにして関数のように使用したり、他のクラスの中にインクルードして利用することが出来ます。
沢山のクラスを作成するとき、構造も用途も似たようなクラスは継承していくことができますが、構造が似ていても用途が違うと、クラスの継承では不都合な部分も共通化してしまうことがあります。
そのような場合、共通となる機能をモジュールとして定義し、各クラスにインクルードして利用することができます✨
クラスの継承についてはこちらの記事をご参照ください😇

モジュールをクラスにインクルードするプログラムを作成しました💡

gist.github.com
結果は以下のとおりです。
f:id:mistyrinth:20181127183433p:plain

また、モジュールには、メソッドを関数のように使用するという使い方もあります。
そのためには、以下のようにモジュール内に定義したメソッドを「モジュール関数」に設定します。

module_function :メソッド名

これでモジュール内のメソッドが関数になりました!
プログラムの中でこのモジュール関数を使うには、以下のように書きます。

モジュール名.メソッド名

モジュールはオブジェクトを作成できないので、このように関数として実行します💪
実際にやってみました!

gist.github.com
結果は以下のようになります。

f:id:mistyrinth:20181127190309p:plain

本日は以上です\(^^)/