【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

好きなことで生きたくて、SEを辞めてブロガー&ゲーム実況で活動中。パソコン、ネット、ゲームが大好き。YouTubeのチャンネル登録&Twitterのフォローもぜひお願いします!









好きなことで生きるために

自分の好きなことや、得意なことを仕事にして、
生きていく方法をこのブログで示します。



資産運用ならウェルスナビがおすすめ!

ウェルスナビなら誰でも簡単に自動で資産運用を始められますよ!
まだ資産運用を始めてない人は、ぜひ一度チェックしてみて下さいね。


コメントを残す

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