【Ruby入門】モジュールで名前空間とミックスインを覚える!【#10】


こんにちは。Tomoyuki(@tomoyuki65)です。

Rubyには、クラスに似た概念としてモジュールというのがありますが、使ったことはありますか?

 

モジュールは、クラスと同様にメソッドや定数をまとめることができますが、クラスと違いインスタンス化や継承ができません。

 

ただし、モジュールはクラスやメソッド名の重複を避けたり、他のプログラミング言語のように多重継承の実現、そしてクラスの肥大化を抑えれるんです!

 

この記事では、モジュールの使い方について解説します。

 



モジュールの定義

モジュール定義する方法について見てみましょう。

モジュールを定義する場合、モジュール名の一文字目は必ず英大文字である必要があります。

module モジュール名
定数やメソッド
end

 

モジュールから直接メソッドを呼び出したい場合は、2種類の記載方法があります。

例として以下のプログラムを実行してみて下さい。

module Say
# 定数を定義
VERSION = 1.0
# 1: selfオブジェクトを使用する
def self.hello
puts "Hello"
end
# 2: module_functionメソッドを使用する
def hi
puts "Hi"
end
module_function :hi
end
# モジュールから直接メソッドを実行
Say.hello
Say.hi
# 定数にアクセスする場合
puts Say::VERSION

 

実行結果
Hello
Hi
1.0

 

実行結果の通り、モジュールを関数として使用することも出来ます。

 

名前空間

次は名前空間について説明します。

名前空間とは、名前の衝突を避けるために使う概念です。

 

プログラムが複雑になると、他の人が作成したクラス名やメソッド名と重複してしまう可能性がでてきます。

ただし、モジュールを名前空間として使用することで重複を避けることが出来ます。

 

では例として以下プログラムを実行してみて下さい。

# Userクラスを定義
class User
def say
puts "Hello"
end
end
# モジュールを名前空間としてUserクラスを定義
module Person
class User
def say
puts "Hello from module"
end
end
end
# Userクラスのインスタンスメソッドを実行
User.new.say
# 名前空間を利用する場合、「モジュール名 + :: + クラス名」 とする
Person::User.new.say

 

実行結果
Hello
Hello from module

 

実行結果の通り、名前空間を利用することでクラス名やメソッド名の重複を避けることができます。

 



ミックスイン(Mix-in)

次はミックスインについて説明します。

ミックスインとは、モジュールをクラスで読み込むことです。

ミックスインを行うと、モジュール中のメソッドや定数を使用することが出来ます。

 

では以下のプログラムを実行してみて下さい。

# モジュールを定義
module Person
VERSION = 1.0
def say
puts "Hello from module"
end
end
# クラスからモジュールをincludeする
class User
include Person
end
# sayメソッドを実行
User.new.say
# VERSION定数にアクセス
puts User::VERSION

 

実行結果
Hello from module
1.0

 

Rubyは単一継承のため、通常一度しかクラスの継承ができません。

ただし、ミックスインをすることで多重継承を実現することができます。

 

クラスメソッドとして取り込む場合
モジュールはクラスメソッドとして読み込むことができ、その場合は「extend」を使います。

以下のようにincludeをextendに変更し、User.sayを実行してみて下さい。

class User
  extend Person
end
User.say  # 実行結果 => Hello from module

尚、extendの動作については特異クラスという概念の理解が必要になりますので、現時点では上記の点だけ理解しておけば良いでしょう。

 

まとめ

  •  Rubyではモジュールという概念があり、モジュール関数や、名前空間およびミックスインのために使うことができる
  •  名前空間はクラス名やメソッド名の重複を避けるために利用し、ミックスインをすることで、多重継承を実現できる

 

  •  関連記事

オススメのRuby入門サイトはどれ?Rubyの学習方法をまとめる

2017.10.24

 

The following two tabs change content below.
Tomoyuki

Tomoyuki

2018年1月1日に開業したプロブロガー1年目です。 元EBSエンジニア(SE)で、今はブログ運営とゲーム配信をしています。 Rubyを中心としたWeb開発情報や仮想通貨について情報発信中です!








シェアありがとうございます、


時代の変化とともに、多様な生き方へ

仕事がAIや自動化で無くなっていく時代を生き抜くために、
モノ創りと多様な生き方を示します。



ビットコインを買うならZaif取引所がおすすめ!

Zaif取引所は他の主要取引所と比べて手数料が安いのが特徴。
ビットコインの他、イーサリアム、モナーコイン、ネムも購入可能です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です