
今回は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入門