moduleについて

2017/11/26

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