Ruby

「モジュール」って何なんだろう?

0

プログラムスクールで勉強しているときにはほとんど出てこなかったが、名前だけでも聞くことがあった「モジュール」について気になったので、例のごとく「プロを目指す人ためのRuby入門」で調べてみました。

モジュールについて

特徴

モジュールの特徴は大きく2つ

①クラスと違って、モジュールからインスタンスは作れない
②他のモジュールやクラスを継承することはできない。
⇒継承の場合、Rubyは単一継承なので、複数のクラスを継承することはできないが、モジュールの場合は複数のモジュールをクラスに入れることができる。

①②からモジュールはクラスとは別物と思った方が良い。クラスはよく「データの設計図」みたいなことを言われるが、モジュールは「追加したい機能や共通化させたい機能をパッケージ化」したものという言い方が良いかもしれない。


クラスについてはこちらで内容をまとめています


モジュールの使用用途はいくつかあります。ここでは3つを紹介したいと思います。

①既存のクラスに機能を追加する
②クラス名の重複を防ぐ(名前空間の作成)
③モジュール単体で使う

①既存のクラスに機能を追加する

既存のクラスに機能を追加することを「ミックスイン」と言う。ミックスインする方法はinclude、extend、prependの3つがある。

include

extend

extendはincludeとは違って、モジュール内のメソッドをミックスイン先のクラスの特異メソッド(クラスメソッド)にすることができる。

prepend

prependはRuby2.0から使用できるようになったもので、特徴としては、同名のメソッドがあったときに、ミックスインしたクラスよりも先にモジュールのメソッドが優先して呼ばれることである。この特徴を生かして、既存メソッドの置き換えをすることができる。

②クラス名の重複を防ぐ(名前空間の作成)

大規模なプログラムを書いているときに、クラス名が重複する場合が出てくるらしい。そのときにモジュールを使うと、同じクラス名にならないように回避してくれる。

③モジュール単体で使う

モジュールはクラスにミックスインしなくても、単体で使用することができる。そのときに使うのが、「module_function」メソッド。このようにミックス員しても、モジュール単体で特異メソッドとしても使えるメソッドのことを「モジュール関数」と呼ぶ。モジュール関数は、他のクラスにミックスインすると、自動的にprivateメソッドになる。

refinementsで有効範囲を指定する

Ruby2.0からrefinmentsと呼ばれる機能が導入された。これは、独自の変更の有効範囲(スコープ)を限定することができる。これは例文コードを見た方が分かりやすい。

今回の例では、クラス内でのメソッドの有効範囲を指定したが、Ruby2.4からはモジュール内でもrefineが使えるようになったらしい。

0
ABOUT ME
chopes
前職では、人材業界で法人営業・キャリアアドバイザー・大阪責任者をしていました。他にも、新入社員の研修策定と育成、面談者の集客におけるスカウト業務や中途採用の面接官、新卒採用の2次選考官、インターンシップのメンターとしてプログラムに参加していました。退職後は、未経験でエンジニアになるためにスクールに通学して勉強。2ヶ月の転職活動を経て、今春からRailsエンジニアとして第二のキャリアを歩むことになりました。主に学習記録や未経験エンジニアについてアウトプットしていきたいと思います! 以下、Twitterアカウントですので、気軽にフォローしてください! Twitter:@chopesu_se