モジュールとは
複数の処理を書く際に共通の処理をまとめておく時に使われるもの。
使い方としては、後に説明するミックスインの機能を使って、複数のクラスで定義する
共通の複数の処理をモジュールを定義しまとめることによって、いちいち処理を定義し、コードを
書かずとも呼び出すだけで良くなるというメリットや、コード量が少なくなり、見やすくなるなどの
メリットがある。
モジュールを定義するときは、下記のような書き方から始まる。
module SampleModule
end
このようにmodule モジュール名から始まり、classを定義する際や、メソッドを定義する際と同じよう
にendで終わる。
moduleの中には、上記のようにいつでも呼び出せたらいいような、処理をまとめておく。
これにより、コードも見やすくなり整理されていい感じである。
次に、処理を定義したmoduleの呼び出し方について見ていく。
モジュール内で定義したメソッドを関数として呼び出す方法。
module SampleModule
def sum(a,b)
a + b
end
module_function:sum
end
puts SampleModule.sum(1,1) => 2
上記のようにfunction_moduleメソッドでモジュール内で定義したメソッドをシンボルで指定する事で
関数として呼び出す事ができる。
module内で定義した定数を呼び出す方法
module SampleModule
CONST_NUM = 100
def sum(a,b)
a + b
end
end
puts SampleModule::CONST_NUM => 100
上記のようにモジュール名にコロンを二つで指定する事ができる。
includeを使ったmodule定義したメソッドを呼び出す方法
module SampleModule
CONST_NUM = 100
def const_num
CONST_NUM
end
end
include SampleModule
puts CONST_NUM
puts const_num
モジュールを定義後、includeメソッドを呼び出すことで、その下から、直接、
moduleで定義したメソッドや、定数を呼び出す事ができる。
ミックスインについて
ミックスインとはクラスにモジュールを読み込ませることである。下記のsample codeで説明する。
module SampleModule
def sum(a,b)
a + b
end
end
class Sample
include SampleModule
def call_sum(a,b)
sum(a,b)
end
end
sample = Sample.new
sample.sum(1,1) => 2
sample.call_sum(2,2) => 4
上記では、sumという複数のクラスで使うと仮定したメソッドを定義している。その定義した処理を
クラスにincludeメソッドで読み込むことによって、見やすく、手間を省く事ができている。
また、ModuleSampleで定義したメソッドもSampleクラスでincludeすることにより、
sampleクラスのオブジェクトをレシーバーに、関数として、sumメソッドを呼び出す事ができている。
他のクラスでまた、moduleで定義したメソッドを呼び出す場合は、同じようにincludeを使うと良い。
まとめ
複数のクラスで使いそうなメソッドは、モジュールを定義し、まとめておき、いつでも呼び出せるようにしておく。
また、クラス定義ではなく、普通に何度も使いそうなメソッドも、module_function :メソッド名で定義する事でコードを書く手間が省けて良い。