Ruby
Rails
初心者
module
RubyOnRails

[初学者]module(モジュール)について調べたこと

目的

  • module(モジュール)について理解を深めるため

目次

  • moduleについて
  • moduleの呼び出し方について
  • classに定義したメソッドとは異なる用途について

moduleについて

moduleを一言で表すと下記のようになります。

「インスタンス化できないクラスのようなもの」
「インスタンス化能力はないが、メソッドを格納できるもの」

一応、上辺だけ分かりました。人に聞かれたとき、この一言使えばいいぐらいに

moduleの定義式  
module モジュール名

end
# モジュールのインスタンスは作成できない
shimada = Tamago.new # NoMethodError: undefined method 'new' for Tamago.Module

moduleの呼び出し方について

module定義の中では別のmoduleclassを定義できる。
よって、名前空間として利用できます。

名前空間とは?

  • 名前の衝突を避けるために使う概念です。
  • プログラムが複雑になると、他の人が作成したクラス名やメソッド名と重複してしまう可能性がでてきます。
  • モジュールを名前空間として使用することで重複を避けることができます。

名前空間を利用した呼び出し

同じ名前のクラス(Shimada)を異なるmoduleの中に定義した場合、ネストしたclassやmoduleは「::」を用いて参照します。

違うmoduleに書かれた同じclassを呼び出す
module Gyudon
  class Shimada
     def self.order
      puts '牛丼注文'
    end
  end
end

module Katsudon
  class Shimada
     def self.order
      puts 'カツ丼注文'
    end
  end
end

# 同じクラス名が2つある。その場合に
# 「::」を用いて参照する
Gyudon::Shimada      # =>Gyudon::Shimada 
Katsudon::Shimada    # =>Katsudon::Shimada

Gyudon::Shimada.order      # "牛丼注文"
Katsudon::Shimada.order    # "カツ丼注文"
モジュールから直接メソッドを呼び出したい場合(2種類)
# class名と同じように始まりの文字は大文字を使います。
module Shimada

# 定数を定義
VERSION = 1.0

# 1: selfオブジェクトを使用する
  def self.gyudon
    puts "Gyudon!"
  end


# 2: module_functionメソッドを使用する
  def katsudon
    puts "Katsudon!"
  end
  module_function :katsudon
end

# モジュールから直接メソッドを実行
Shimada.gyudon
Shimada.katsudon

# 定数にアクセスする場合
puts Shimada::VERSION

classに定義したメソッドとは異なる用途について

moduleに定義したメソッドとclassに定義したメソットでは用途が違います。
違いとしては以下の4つが挙げられます。

  1. 名前空間を作る
  2. moduleのメソッドをあるclassのインスタンスメソッドとして取り組む
  3. moduleのメソッドをあるオブジェクトの特異メソッド(クラスメソッド)として取り組む
  4. 特異メソッドやmodule関数を定義して使う

なぜ、上記のような用途なるかというとmoduleの特徴を知る必要があります。

moduleの特徴
  • インスタンスを生成できない
  • 継承できない

最後に

うまく書けなかったので、どんなものか特徴だけ書きました。
あと、書いてて思ったのはRubyについてもっと勉強しようと思った。
moduleとか他の言語でもあるし、根本的な知識が足りていないって気付かされたのが本当良かった。

参考

改訂2版 パーフェクトRuby