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はクラスメソッド(特異メソッド)として使用できるようにしてくれます。

以上です。

参考:Amazon CAPTCHA