Ruby

【Ruby】名前空間とは?モジュールを使った簡単な使い方を解説!

※当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

コード

ひでまる
ひでまる
こんにちは!ひでまるです!
今回はRubyのモジュールを使った名前空間について学習していくよ!

 

こんな方におすすめ

  • Rubyを学習している人
  • モジュールを理解したい人

現場でRubyを使って開発しているので、個人の勉強記録として残します。

モジュールって何?という方は下記で説明しているので、見てみてください。
【Ruby】モジュールのミックスインとは?使い方を解説!

 

名前空間とは?

一言で言うと、「同じ名前のものを混乱しないようにグループ分けする仕組み」のことです。

 

例えば、佐藤さんという人が、ある学校のA組 にいるとしましょう。
しかし、B組にも同じ名前の佐藤さんがいます。

このとき、廊下で大声で
佐藤さーーーん!と呼んだらどうなるでしょう?

A組の佐藤さんも、B組の佐藤さんも、どちらも返事をするかもしれません。
でも、本当はA組の佐藤さんを呼びたかったのに、間違ってB組の佐藤さんが返事をしてしまう、なんてことがありそうですよね。。。

これだと困ってしまうので、名前を呼ぶときは「A組の佐藤さん」と呼べば問題なさそうです!
Rubyの世界だとこれを「A組::佐藤さん」のように記述してA組の佐藤さんということを分かるようにします。これが名前空間です。

 

名前空間(モジュール)の定義方法

module モジュール名
  class クラス名
    #色々記述
  end
end

モジュールを定義し、その中にクラスを定義します。
こうすることで、〇〇モジュールに属する〇〇クラス という形で、クラスをモジュールのグループにまとめることができます。

 

佐藤さんのサンプルコードで理解する

佐藤さんのサンプルコードで「名前空間なしの場合」「名前空間ありの場合」を比較して、理解していきます。

◎名前空間なしの場合
A組の佐藤さんを呼んでみましょう!

class Sato
 def reply
  puts "A組の佐藤です!"
 end
end

class Sato
 def reply
  puts "B組の佐藤です!"
 end
end

sato_desu = Sato.new
sato_desu.reply  # => B組の佐藤です!

結果:B組の佐藤です!

「sato_desu.reply」で佐藤さんを呼びましたが、回答したのはB組の佐藤さんでした。。。A組の佐藤さんを呼びたかったのに。。。
※ Rubyではオープンクラスになっているので、Satoクラスが再定義され「B組の佐藤さん」が呼ばれたとなります。

◎名前空間ありの場合

module A
  class Sato
    def reply
      puts "A組の佐藤です!"
    end
  end
end

module B
  class Sato
    def reply
      puts "B組の佐藤です!"
    end
  end
end

# A組の佐藤さんを呼び出す
a_sato = A::Sato.new

a_sato.reply  # => A組の佐藤です!

結果:
A組の佐藤です!

今度は「A::Sato」のように「Aモジュールに属する佐藤さん」を指定して、replyメソッドを呼ぶ事で、指定したA組の佐藤さんを呼ぶことができました。
このように名前空間を行うことで、それぞれの佐藤さんを正しく呼べるようになります。

おわりに

今回はモジュールの名前空間について学習してみました。
少しでも学習のお役に立てれば幸いです。

 

参考記事

書籍:プロを目指す人のためのRuby入門

-Ruby