include, extend, module_functionの違いをわかりやすくまとめてみた!

どうも!
インストラクターのババです!

みなさんはモジュールを使っていますか?
僕はrubyを勉強したての時、モジュールって何かややこしいイメージを持っていて全然使わないでいました。

でもモジュールって以外と簡単に使えるんです。

今回はそんなモジュールを使うためのメソッド
「includeメソッド」「extendメソッド」「moduel_functionメソッド」について解説していきたいと思います!

目次

はじめに

shutterstock_403896286
よくincludeメソッドっとごっちゃになっるメソッドに「requireメソッド」があります。
requireメソッドは「ファイルを読み込むためのメソッド」です。

includeメソッド、extendメソッド、module_functionメソッドは「moduleを読み込む、使用するためのメソッド」です。
しっかりと区別をするようにしましょう!

includeメソッド

では初めはmoduleを使うための基本である「includeメソッド」から解説していきます。
moduleは定義するだけでは使用することができず、メソッドを用いて、使えるようにしてあげる必要があります。
そのためのメソッドが「includeメソッド」です。
実際にコードで見ていきましょう。

module Dog
  def name
    "ポチ"
  end
end

class Animal
  include Dog
end

animal = Animal.new
p animal.name
# => ポチ

DogモジュールをAnimalクラスにincludeすることで、Animalクラスのインスタンスメソッドとして、Dogモジュールのnameメソッドを定義できていることがわかります。

このようにインスタンスメソッドとして、読み込ませるのが「include」です。

extendメソッド

次に「extendメソッド」について見ていきましょう。
extendメソッドもincludeメソッドと同じように、モジュールのメソッドを使用するためのメソッドです。

module Dog
  def name
    "ポチ"
  end
end

class Animal
  extend Dog
end

p Animal.name

includeメソッドと同じようにメソッドが使用できていることがわかります。
includeメソッドとの違いは「クラスメソッド」としてモジュールがインクルードされる点です。

 

  • includeはインスタンスメソッド
  • extendはクラスメソッド

 

 

というように使い分けをきっちりできるようにしましょう。

module_function

shutterstock_394879966
基本的にモジュールはクラスに読み込ませて使うものですが、クラスに読み込ませなくても使う方法があります。
それが「module_functionメソッド」です。

module Dog
  def name
    "ポチ"
  end
  module_function :name
end

p Dog.name

module_functionメソッドを使用することで、このように普通にメソッドを使用できていることがわかります。

まとめ

今回はmoduleの使い方について「includeメソッド」「extendメソッド」「module_functionメソッド」の三つを解説していきました。
Rubyは書き方が自由な分、いろいろなメソッドがあり、使い分けが難しいことが多いです。
地道に自分でコードを書いて一歩ずつ覚えていきましょう!

この記事を書いた人

こんにちは!
今年大学を飛び出し、フリーランスエンジニアとして働いています、ババです!

エンジニアはしんどい仕事と思われていますが、実はそんなにしんどくなくて、お金ももらえて、社会のためになる素晴らしい仕事というのを伝えるために、侍で業務委託として働いています!!

フリーランスの日常やら書いているブログやってます=>http://www.babashun.net/

目次