【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入門サイトおすすめ3選!初心者向けの学習方法を解説

2017年10月24日

 

The following two tabs change content below.

Tomoyuki

SEを5年経験後、全くの未経験ながら思い切ってブロガーに転身し、月間13万PVを達成。その後コロナの影響も受け、以前から興味があったWeb系エンジニアへのキャリアチェンジを決意。現在はWeb系エンジニアとして働きながら、プロゲーマーとしても活躍できるように活動中。








シェアはこちらから


【2024年】おすすめのゲーミングPC

モンハンワイルズの発売日とPC版(Steam版)の推薦スペックが公開されたので、おすすめのゲーミングPCをご紹介!


コメントを残す

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