moduleについて
moduleについてなんとなーくでやっていたので、まとめます。
classとの違い
- インスタンスを生成することはできない
- 継承することはできない
用途
- 名前空間を作る
- モジュールのメソッドを、あるクラスのインスタンスメソッドとして取り込む
- モジュールのメソッドを、あるオブジェクトの特異メソッド(クラスメソッド)として取り込む
- モジュール関数を定義して使う
特異メソッドとして使用
インスタンス化はできないですが、特異メソッドとして使用することはできます。
self.
をつけて定義したメソッドはモジュールの特異メソッドです。
module Greet def self.hello(name) puts "#{name}さん、こんにちは#{self.class}" end end Greet.hello('foo') =>fooさん、こんにちはModule
メソッドをクラスのインスタンスメソッドとして取り込む
module Greet def self.hello(name) puts "#{name}さん、こんにちは#{self.class}" puts '特異メソッド' end def hello(name) puts "#{name}さん、こんにちは#{self.class}" puts 'メソッド' end end class Japanese include Greet end foo = Japanese.new foo.hello('foo') =>fooさん、こんにちはJapanese =>メソッド
ここで特異メソッドは使用できるのか?という疑問が浮かびました。
実験してみましょう。
Japanese.hello('japan') =>undefined method `hello' for Japanese:Class (NoMethodError)
どうやら特異メソッドはinclude
するだけではダメなようです。
特異メソッドを使用できるようにする
moduleの特異メソッドを使用するには、extend
を使用します。
class Japanese include Greet extend Greet end Japanese.hello('japan') =>japanさん、こんにちはClass =>メソッド
selfの方が呼ばれないのは、selfはあくまでも、moduleに関しての特異メソッドなんですね。
extendはクラスメソッド(特異メソッド)として使用できるようにしてくれます。
以上です。