Search

検索したいワードを入力してください

2019年04月09日

Rubyのextendとincludeの違いを特徴から解説

Rubyのプログラミングでは、extendを使ってモジュールを組み込むか、includeの方が適当なのか、迷う局面があります。Rubyでは、extendやincludeのほかにも類似メソッドが用意されているので、それぞれの使い方をきちんと覚えておきましょう。

Rubyのextendとは

Rubyのextendメソッドは、オブジェクトの特異クラスにモジュールを取り込み、モジュールのメソッドを特異メソッドとして使えるようにできるメソッドです。

extendで取り込むモジュールは引数として指定します。引数に指定するモジュールは、複数でも構いません。Rubyのextendメソッドの戻り値はレシーバ自身となります。

extendメソッドの記述例

言葉による説明よりも、以下の使用例を参照し、extendの動きを理解しましょう。使用例では、aメソッドで文字列を返すSampleモジュールを定義し、extendメソッドから呼んで出力しています。

【extend使用例】
module Sample
def a
'extend sample'
end
end

obj = Object.new
obj.extend(Sample)
p obj.a

Rubyのextendとincludeの違い

Rubyには、extendと同じような使い方をするincludeというメソッドもあります。どちらもクラス継承の際に使われます。

両者の違いを簡単な言葉で説明すると、「インスタンスメソッドとして取り込むか、クラスメソッドとして取り込むかの違い」ということになります。ただし、extendは使い方によって、どちらでも使用可能です。

言葉の説明だけではわかりづらいので、以下のサンプルコードで考えてみましょう。

extendを使ったモジュール例

Rubyのextendを使ったプログラムの動きを理解するため、名前を引数として与え、「I am ~」の形で出力するプログラムをご紹介します。

【サンプルコード】
module Introduce
def my_name(name)
puts "I am #{name}"
end
end


【実行コード】
o = Object.new
o.extend Introduce
o.my_name "Taro"


【実行結果】
"I am Taro"

サンプルコードにおけるextendの使い方

サンプルコードの中では、引数として渡されたnameを出力するモジュールを定義しています。実行時に、オブジェクトを生成し、Rubyのextendメソッドで定義したモジュールを使えるよう、オブジェクトを拡張します。

その結果、サンプルコードで定義したモジュールの呼び出しが行え、実行結果には引数として指定した名前が返されます。

includeを使ったモジュール例

Rubyのincludeメソッドを使った場合のプログラムの動きを理解するため、氏名をデータとして入力したときに、自己紹介の形で出力するプログラム記述を参照してみましょう。

extendメソッドを使うときと異なり、複数のモジュールをまとめて1つのクラスに定義することができます。

サンプルコード

引数を自己紹介の形に成形し、出力します。

【コード記述例】
module FirstN
def first_name(name)
puts "My first name is #{name}"
end
end

module LastN
def last_name(name)
puts "My family name is #{name}"
end
end

class Introduce
include FirstN
include LastN
end

実行結果の確認

コンソールやターミナルから、サンプルコードで記述したモジュールを呼び出してみましょう。以下の実行コードのように、確認用の「氏」「名前」を各メソッドの引数として渡してみましょう。

【実行コード】
m = Introduce.new
m.first_name "Taro"
m.last_name "SUZUKI"


【実行結果】
"My first name is Taro"
"My family name is SUZUKI"

サンプルコードにおけるincludeの使い方

サンプルコードの中では、引数として渡されたnameを出力するfirst_nameとlast_nameという2つのモジュールを記述しています。定義した2つのモジュールをincludeにより定義したIntroduceというクラスを定義しています。

実行時に、Introduceクラスを生成すると、クラス内で定義されている2つのモジュールが利用できます。

extendの特徴

extendを他の類似メソッドと区別するための特徴・使い方としては、次のような内容を挙げることができます。

・extendを使うと、モジュールのインスタンスメソッドが、self の特異メソッドとして拡張される(extendは、レシーバの特異クラスにModuleのメソッドを組み込む)
・class内でextendすることも、インスタンスにextendすることもできる

クラスメソッドとして取り組むことができる

extendを使って、モジュールをクラスメソッドとして組み込むと、以下のように、クラス定義したメソッドとして直接指定できるようになります。

【コード記述例】
module Sample
def a; xxx; end
end
class AAA
extend Sample


【実行コード】
AAA.a

インスタンスメソッドとしても使用できる

extendはインスタンスメソッドとして、定義したモジュールを使うこともできます。

【コード記述例】
module Sample
def a; xxx; end
end
class AAA
extend Sample

includeの特徴

includeをextendなどの類似メソッドと明確に区別して覚えるためには、以下の特徴・使い方を頭に入れておくことをおすすめします。

・includeはモジュールを呼ぶためのメソッドである
・includeを使うと見えないスーパークラスとして、親クラスに組み込まれる
・moduleのインスタンスメソッドをそのままインスタンスメソッドとして使える

インスタンスメソッドとして取り組む

定義したRubyのモジュールを、includeを使ってインスタンスメソッドとして組み込む場合は、以下のようにクラス定義を行います。

【コード記述例】
module Sample
def a
《処理記述》
end
end

class AAA
include Sample
end

includeとextendを同時に行う方法

Rubyでモジュールを取り込む際に、extendメソッドにより組み込むか、includeメソッドにより組み込むかは、スッキリと理解するのが難しいという人が少なくありません。

どちらのメソッドを使うべきか迷うのであれば、モジュールをincludeすれば、クラスメソッドとしても、インスタンスメソッドとしても追加される、というコードの記述方法もあります。

extendとincludeを同時に記述してみよう

以下のコード記述例のモジュールAをincludeすると、クラスメソッドとして aaaが、インスタンスメソッドとして bbbが使用できるようになります。

【コード記述例】
module A
def self.included(base)
base.extend(B)
end

module B
def aaa
puts 'method:aaa'
end
end

def bbb
puts 'method:bbb'
end
end

モジュール側のActiveSupport::Concernで継承する

先にコード記述例として挙げたサンプルコードは、extend ActiveSupport::Concernを使って記述することもできます。

【コード記述例】
module A
extend ActiveSupport::Concern

module B
def aaa
puts 'method:aaa'
end
end

def bbb
puts 'method:bbb'
end
end

まずextendとincludeの違いをしっかり覚えよう!

Rubyでプログラミングでは、モジュールの組み込みにincludeを使うべきか、extendを使うべきか、どうしても迷ってしまうという人が多く見受けられます。

インスタンスメソッドとして使うか、クラスメソッドとして使うかを基準に使い分けることもありますが、基準はそれだけではありません。

Rubyのextendとincludeを使い、実行結果を見ながら、使い分けができるようにしておきましょう。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related