【Ruby入門】includeの使い方とrequireとの違いについて解説!

こんにちは!エンジニアのかい@dikxs118です。

今日はRubyのincludeについて見ていってもらえたらと思います。

プログラム初心者の方がまずつまづくところが、クラス、モジュールの概念だったり、このincludeの概念だったりします。

ここでしっかり分かっておくか置かないかで今後大きく変わっていきます。

そのため、まだ分かってない方はしっかり勉強していきましょう。

今日は、

・includeとは

ということをメインに

・クラスとはなにか
・モジュールとはなにか
・includeとrequireの違い

という部分をしっかりと説明していきます。

目次

includeとは

そもそもincludeとはどのようなものなのでしょうか。

includeはモジュールの性質を他のクラスに追加するために使用されるメソッドとなります。

言い換えるならばincludeはモジュールをよぶためのメソッドです。

includeは以下のように記述します。

include モジュール名

では実際にincludeを使ってみましょう。

module Sayhello
  def hello
    p 'hello'
  end
end

class Sayhello_2
  include Sayhello
end

a = Sayhello_2.new
a.hello
“hello"

このように、定義したモジュールをクラスの中でincludeすると、インスタンスを立てることができます。

クラスやモジュールについての理解がないとincludeを理解することはできません。

そのため、次項では簡単にクラスとモジュールについても説明しておきます。

クラスとモジュールの違い

基本的にどちらもひとかたまりのデータをまとめたものなのですが、大きな違いはいかの2つです。

・どうやって継承させるか
・インスタンスを立てることができるか

他にも細かい違いやモジュールは名前空間を作れたりとあるのですが、本題ではないのでここでは説明しません。

モジュールについて詳しく知りたい方は以下の記事を読んでみてください。

クラスについて詳しく知りたい方はこちらの記事が参考になるでしょう。

では、違いを一つずつ見ていきましょう。

どうやって継承させるか

親クラスの機能を子に受け継がせることのできるのが「継承」ですが、クラスでは一つの親のみしか継承することができません。

そのため、クラスの継承は単一継承と言われています。

対して、モジュールは厳密には継承ではないのですが、Mixinという技術を用いて多重継承を可能としています。

モジュールでは継承できないという文献をよく見かけますが厳密に言えば正しいのですが、Mixinを用いて継承のようなことを複数できるため、そこまで厳密に考える必要はないでしょう。

簡単にお互いの使い方を見てみましょう。

クラスを継承してみよう!

ではクラスを継承してみます。

継承するときは<に続けてスーパークラス(親クラス)を定義します。

class Sayhello
  def hello
      p "hello_1"
  end
end

class Sayhello_2< Sayhello
  def hello_2
    p "hello_2"
  end
end

a = Sayhello_2.new
a.hello
a.hello_2
"hello_1"
"hello_2"

はい、Sayhello_2のインスタンスを立てたにもかかわらずそのインスタンスでhello_2を呼び出せていますね。

これが継承です。

クラスなので一つしか継承出来ません。

モジュールでMixinしてみよう!

では次は、モジュールの多重継承の例を見てみましょう。

モジュールの継承のさせかた(正しくはMixinという)は主にクラス内に呼び込むと言う形で使います。

どうやって呼び込むかというと、includeをつかって呼び込みます。

つまりイメージとしては、includeを使ってモジュールをクラス内に呼び込むということで多重継承を可能としています。

最初でもやった通りにですが実際にもう一度やってみましょう。

module Say
  def say
    p "say"
  end 
end

module Hello
  def hello
    p 'hello'
  end  
end

class Sayhello
  include Say
  include Hello
end

a = Sayhello.new
a.say
a.hello
"say"
"hello"

はい、SayHelloのモジュールを2つSayhelloのクラスの中で呼び出すことができましたね。

ここまでで、クラスとモジュールの違い、includeの使い方は大分わかったのではないでしょうか?

次はクラスとモジュールの違いである、インスタンスを宣言できるかどうかというところもサラッと見てみましょう。

モジュールではインスタンスは立てられない! 

これも大したことではないのですが、一番最初のコードを見てみましょう。

module Sayhello
  def hello
    p 'hello'
  end
end

class Sayhello_2
  include Sayhello
end

a = Sayhello_2.new
a.hello

これにモジュールでもインスタンスを立てようとしてみると、

module Sayhello
  def hello
    p 'hello'
  end
end

class Sayhello_2
  include Sayhello
end

a = Sayhello_2.new
a.hello

b = Sayhello.new #moduleはインスタンス立てられない
test.rb:14:in `<main>': undefined method `new' for Sayhello:Module (NoMethodError)

という風にエラーになります。

なのでモジュールはきちんとクラスの中でincludeするようにしましょう。

includeとrequireの違い

最後に時々Rubyのrequireとincludeが混ざってしまう人がいるようですが、この2つは全くの別物です。

requireは外部ファイルやライブラリを読み込むのに使う
includeはモジュールをクラス内で呼ぶために使う

と全く違うのでこの2つは似てる?とか思っている人はその違いしっかりと理解しておいてください。

また、requireについて詳しく知りたい方はこちらの記事を参考にしてください。

まとめ

いかがでしたでしょうか?

しっかりと、クラス、モジュール、includeについて理解できたでしょうか?

・クラスは単一継承しかできず>をつかってスーパークラスを指定する
・モジュールはincludeをつかってクラスの中で継承する(複数可)

ということをしっかりと覚えておきましょう。

モジュールには多重継承以外にも便利な使い方があるので学んでおくと良いでしょう。

概念的に初学者が躓きやすいところですので必ず手を動かして理解に努めてみてください!それでは!!

この記事を書いた人

日向徹かこよすぎか

kaikaikai8217@gmail.com

目次