CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさん、こんにちは。
今回はRubyの文法の話題です。Rubyの「モジュール」についてなのですが、モジュールって皆さん、使われていますでしょうか?
Rubyのモジュールは、多言語でいいますとJavaのインターフェースのようなものと言われることもあるのですが、Rubyのモジュールは実は結構いろいろな役割を持っています。であるがゆえに、正体がとらえにくい・・・ということもあるかもしれません。今まで、あまりモジュールに触れてこなかったという方は、この機会にぜひ知っていただければと思います。
Rubyのモジュールには、主に3つの役割があるといえます。
① 共通に利用するAPI的な関数(モジュール関数)の提供
② 継承に代わってクラスに実装を提供
③ 名前空間の提供
まず、Rubyのモジュールの定義方法を確認してみましょう。
モジュールを定義するには、「module」キーワードに続いて「モジュール名」を記述し、「end」までの間にメソッド定義やクラス定義、「module_function」メソッドなどを記述できます。
モジュールはクラスと定義方法が似ていますが、クラスはインスタンス化できるのに対して、モジュールはインスタンス化することができません。また、クラスと直接継承関係を定義することはできません。
では、モジュールの役割の1つ目である、共通に利用するAPI的な関数(モジュール関数)の提供についてみてみましょう。例えば、Rubyの組込みモジュールにあらかじめ用意されているモジュール関数の例として、Mathモジュールのsqrtメソッドがあります。これは平方根を求めるためのモジュール関数です。こういった数学的演算は、良く用いられるので、手間なく直接呼べると便利ですよね。
モジュールの定義において、「module_function」メソッドで指定されたメソッドは「モジュール関数」として扱われ、「モジュール名.メソッド名(引数)」で直接外部から呼び出すことができます。
組込みモジュールではなく、自分で定義したモジュールのメソッドをモジュール関数にしたい場合は、「module_function」メソッドで指定しておきます。
HelloModuleに定義されたgreetメソッドはmodule_funtionメソッドによってモジュール関数に指定されているため、外部から直接呼び出すことができます。
あるクラスに外から実装を提供したい場合、Rubyでは継承を利用することができるのは皆さんご存知の通りです。継承を利用すればスーパークラスのメソッドを引き継いで利用することができるようになります。
しかしながら、Rubyでは継承は単一継承(1回の継承で宣言できるスーパークラスは1つだけ)のため、同時に複数のクラスから実装の提供を受けることはできません。
モジュールを利用すると、クラスの継承関係に依存せず、自由に実装を提供することができるようになります。
あるクラスが、モジュールに定義されたメソッドを利用できるようにするには、「include」メソッドを使ってモジュール名を指定します。モジュールをincludeすると、そのモジュールのメソッドはあたかも継承されたかのように取り扱われるため、そのクラスをインスタンス化すると、モジュールのメソッドも呼び出すことができます。
いかがでしょうか。まずはモジュールの役割の3つのうちの2つをご紹介しましたが、実はモジュール関数とそうでないメソッドには、includeされる際の振る舞いに違いがあり、設計するにあたっては注意が必要です。
そのあたりの補足と、③の名前空間の提供については、次回のコラムにてご紹介したいと思います。
ということで、今回はいったんここまでです。次回もどうぞお楽しみに。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes