はじめに
現場の開発においてモジュールはかなり使う技術だと思います!
よく使うだからこそ、細かい使い方まで知っていることが開発スピードの向上や、他の人のコードの読解にも役立ちます。
モジュールについて
簡単に説明すると、「インスタンス化出来ないクラスのようなもの」です。
モジュール定義の中に、別のモジュールやクラスを定義したり出来るので、名前空間として利用できます。
module FooModule
class FooClass
...
end
end
FooModule::FooClass #=> FooModule::FooClass
特徴
- インスタンスを生成出来ない
- 継承する事は出来ない
- 名前空間を作ることが出来る
- モジュールのメソッドを、、
- あるクラスのインスタンスメソッドとして取り込む
- あるオブジェクトの特異メソッドとして取り込む
- モジュール関数を定義して使う
クラスにモジュールを取り込む
モジュールに定義されたメソッドを、クラスのインスタンスメソッドとして取り込むことをMix-in(ミックスイン)
と言います。
include
モジュールをクラスに取り込むにはinclude
を使用します。
インスタンスメソッドとして取り込むので、メソッドのレシーバはインスタンスです。
module Hello
def foo
puts 'hello! foo!'
end
end
class Sample
include Hello
end
sample = Sample.new
sample.foo #=> 'hello! foo!'
prepend
モジュールのメソッドをクラスのインスタンスメソッドとして継承ツリーの下位に取り込みます。
前述のincludeと比べて、こちらの方がメソッドの実行順として優先されます。
module Foo
def foo_method
p 'foo_method!'
super
end
end
class Bar
prepend Foo
def foo_method
p 'bar_class!!!'
end
end
bar = Bar.new
bar.foo_method #=> "foo_module!!!", "bar_class!!!"
extend
モジュールに定義されたメソッドを、オブジェクトの特異メソッドとして取り込むこともできる。
extend
により、そのオブジェクトにだけ特定の振る舞いを与えることができます。
module Greet
def greet(name)
puts "hello! #{name}"
end
end
class Sample
extend Greet
end
sample = Sample.new
sample.greet('World') #=> 'hello! World'
モジュール関数
privateなインスタンスメソッドであると同時に、モジュールの特異メソッドであるメソッドのこと。
# 定義方法
module SampleModule
def hello(name)
puts "Hello #{name}"
end
module_function :hello #helloメソッドをモジュール関数とする。
end
# まとめて定義する方法
module SampleModule
module_function #これ以下にメソッドを定義することでモジュール関数となる
def hello(name)
puts "Hello #{name}"
end
def greet(name)
puts "Good Morning #{name}"
end
end
モジュール関数の呼び出し方
#直接的にモジュールから呼び出す。
SampleModule.hello('Tanaka') #=> Hello Tanaka
#includeする。
include SampleModule
hello('Tanaka') #=> Hello Tanaka
終わりに
モジュールは奥が深いけど、確実に自分の武器になるので扱えるようになりたいものですね!
少しずつ頑張りましょう。。!