Ruby入門 part9
引き続きRuby入門やっていきます!
「クラスとモジュール」の後半です。
目次
1.アクセス制御
前回のクラスとモジュールの前半では、クラスの定義の方法などを学びました。
また、別の記事(メソッド)では、メソッドの定義の方法などを学びました!
通常、クラス内にメソッドを定義して、そのクラスから作成されたオブジェクトから、定義したメソッドを実行します。
また、オブジェクトからではなく、クラス内の別のメソッドから実行されるメソッドというものを定義することもあります。
このとき、メソッドが誤ってオブジェクトから実行されないように、メソッド毎にアクセス制御レベルを設定することができます✨
オブジェクトからインスタンスメソッドとして実行可能なメソッドにはpublic
を指定し、クラス内の別のメソッドからのみ実行可能なメソッドにはprivate
を指定します。
方法としては、例えばpublic
を指定するなら、以下のように書きます。
public :メソッド名
書く位置は、クラス内にメソッドを定義した直後が良いと思います😊
アクセス制御を指定しない場合は、public
として扱われます。
ただし、initialize
メソッドは常にprivate
となっています。
initialize
については、Ruby入門 part8のインスタンスメソッドのあたりでちらっと出てきましたね〜👀
試しにプログラム書いてみました。
gist.github.com
public
に設定したaccele
メソッドは、実行すると2行の文字列が出力されます。
一方、private
に設定したcalcSpeed
メソッドは、クラス内の別のメソッド(ここではaccele
メソッド)から呼び出して実行することはできていますが、オブジェクトから実行しようとするとエラーになります🙃
実行結果は以下のようになります。
また、複数のメソッドに対して、まとめてアクセス制御を設定することもできます。
方法は、:メソッド名
の部分を取り除き、public
の1行だけを記述すると、それ以降に定義されたメソッドは全てpublic
に設定されることとなります👌
同様にprivate
の1行だけを記述すると、それ以降に定義されたメソッドは全てprivate
に設定されます。
2.モジュール
クラスによく似たものとして、モジュールというものがあります。
モジュールは以下のように定義します。
module モジュール名
end
モジュールもクラスと同じく、メソッドを定義することができます!
ただし、クラスはクラスからオブジェクトを作成することができるのに対して、モジュールではオブジェクトを作成することができない点が挙げられます。
ここがクラスとモジュールの大きな違いですね〜😗
モジュールの利用方法としては、モジュール名.メソッド名
のようにして関数のように使用したり、他のクラスの中にインクルードして利用することが出来ます。
沢山のクラスを作成するとき、構造も用途も似たようなクラスは継承していくことができますが、構造が似ていても用途が違うと、クラスの継承では不都合な部分も共通化してしまうことがあります。
そのような場合、共通となる機能をモジュールとして定義し、各クラスにインクルードして利用することができます✨
クラスの継承についてはこちらの記事をご参照ください😇
モジュールをクラスにインクルードするプログラムを作成しました💡
gist.github.com
結果は以下のとおりです。
また、モジュールには、メソッドを関数のように使用するという使い方もあります。
そのためには、以下のようにモジュール内に定義したメソッドを「モジュール関数」に設定します。
module_function :メソッド名
これでモジュール内のメソッドが関数になりました!
プログラムの中でこのモジュール関数を使うには、以下のように書きます。
モジュール名.メソッド名
モジュールはオブジェクトを作成できないので、このように関数として実行します💪
実際にやってみました!
gist.github.com
結果は以下のようになります。
本日は以上です\(^^)/