Rubyのmoduleの使い方とメリットを理解して脱初心者!
Rubyには独自の機能がありmoduleもそのうちの一つです。Rubyを習い始めている場合はmoduleの使い方とメリットを理解するところから始めていきましょう。moduleとは?moduleのメリットや使い方を解説していきます。
Rubyのmoduleとは?
moduleは日本語にすると「部品の集まり」や「区分」という意味になります。Rubyのmoduleはclassと同じようにmodule内に関数の定義ができること、プログラム上での役割や振る舞いをまとめることができます。
classとの違いは?
classと同じようなモノと勘違いしてしまうかもしれませんが、明確な違いが2つあります。
1つは、moduleからインスタンスが生成できないこと。もう一つは、moduleは継承できないことが挙げられます。
moduleを使うメリット
moduleを使うメリットは4つありますので、それぞれ見ていきましょう。
名前空間としての利用
たとえば下記のようなプログラムがあったとします。
module Car
class SuperCar
def self.introduce
puts "This is SuperCar"
end
end
end
class SuperCar
def self.introduce
puts "これはスーパーカーです"
end
end
Car::SuperCar.introduce
SuperCar.introduce
このサンプルコードではmodule名とclass名が同名であり、メソッド名も同名になっています。このサンプルコードでは動かないように感じてしまうかもしれませんが、moduleは名前空間としての役割も持っているのでコンパイル上では別のものとして認識されます。
上記サンプルコードの結果は「This is SuperCar」「これはスーパーカーです」と表示されるようになります。大規模なプログラムを構築するにあたり、同名のメソッドが出てくるかもしれませんがmoduleを名前空間として利用することで衝突を避けさせることができます。
インスタンスメソッドとしての利用
Ruby独自の機能にMix-inがあります。Mix-inとはclassにmoduleの機能を混ぜ合わせることを指します。Mix-inをすることでモジュール内のメソッドをインスタンスメソッドとして利用することができるのです。下記のサンプルコードを見てみましょう。
module Lion
def cryLion
puts "ガオー!"
end
end
module Cat
def cryCat
puts "ニャー"
end
end
class Animal
include Lion, Cat
end
obj = Animal.new
obj.cryLion
obj.cryCat
Animalクラス内にそれぞれのモジュールをincludeし、それぞれのメソッドを呼び出せるようになりました。複数のmoduleを上手に活用することで効率の良いプログラミングが可能となります。
extendとしての利用
extendを利用することで定義だけでなく、動的な拡張をすることも可能です。
module Human
def introduce
puts "私は人間です"
end
end
obj = Object.new
obj.extend Human
obj.introduce
空のオブジェクトを生成し、extendで拡張しました。includeでの拡張は静的であるのに対し、動的に対応できるのでプログラムの柔軟性が増します。
すでにあるmoduleの利用
Rubyにはすでに用意されているmoduleが存在します。Fileに関するmoduleのFile::ConstantsやFileTest、数学関数のサポートをしているMathなどがあります。
Rubyのバージョンにより差異はありますが、用意されているmoduleはプログラムの安定性や使いやすさの点において優れています。自身で作成する手間も省けますので効率よく開発をすることが可能です。
moduleの使い方
メリットの項目でサンプルコードを記述しましたが、改めてmoduleの使い方を解説していきます。
moduleを作成
moduleの作成の仕方は下記となります。
module xxxx
end
xxxxの部分に指定のモジュール名を入れてください。関数を入れたい場合はmoduleの宣言部分とendの間に関数定義を入れることで作成されます。
moduleを関数のように使う
moduleを関数のように使いたい場合は下記のように書くことで対応できます。
module Calc
def multi(x, y)
return x * y
end
def divide(x, y)
return x / y
end
module_function :multi
module_function :divide
end
puts(Calc.multi(10,5))
puts(Calc.divide(10,5))
結果は「50 2」と続けて表示されるようになります。ポイントはmodule内にmodule_function :xxxと記入することです。
こうすることでサンプルコードのように関数としての対応が可能となります。
moduleをincludeして使う
classにincludeすることで使用することも可能です。
module Calc
def multi(x, y)
return x * y
end
def divide(x, y)
return x / y
end
end
class Test
include Calc
end
test = Test.new
puts(test.multi(10,5))
puts(test.divide(10,5))
表示は「50 2」となります。TestクラスにCalcモジュールをインクルードしたことでCalcモジュールの関数を使用することができるようになりました。
クラス内でmoduleを使うには
クラス内でのmoduleの使用方法は下記のようになります。
module Calc
def multi(x, y)
return x * y
end
end
class Test
include Calc
def calc(x, y)
puts(multi(x,y))
end
end
test = Test.new
test.calc(10,2)
表示結果は20となります。クラス内でもmoduleは通常のコードのように使用できますので、振る舞いに応じて対応してみましょう。
Rubyのmoduleを理解して効率よいプログラムを書こう!
Rubyのmoduleを理解することで効率よいプログラムが書けるようになります。業務でもよく使われることから、メリットや使い方を理解するようにしましょう。
この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。興味のある方はぜひご参加ください。