Kintarou'sBlog

プログラミング学習中。学習内容のアウトプットや読書で学んだことなど随時投稿!

【Ruby】includeメソッドとinclude?メソッドの違い

こんにちは😊Kintarouです。

現在エンジニア転職を目指してTECH CAMPにてプログラミング学習中です👨‍🎓
夢はフリーランスエンジニアになって働く人が働きやすいシステムを作ること!
と、愛する妻と海外移住すること🗽

プログラミングや読んでいる本のことなど、ブログに書いていきます!
twitter : https://twitter.com/ryosuke_angry


そもそもincludeって?

学習中にincludeが出てくる度に「include」ってなんだっけ?となるのでまとめてみました。日本語で言うと「含める」という意味なのですが、抽象的すぎて「具体的にどういうことをしてくれるメソッドなの?」となってしまっておりました。

かつ、最後に「?」が付くかどうかで使う場面や意味合いも全然違うので余計知識として定着しにくかったのだと思います...(私だけ?)

include?メソッド

説明が簡単なのでまず「?」付きのこちらから。

まず「?」で終わるメソッドは慣習的に”真偽値”を返すメソッドとなります。

include?メソッドは引数の値が”含まれているかどうか”を真偽値で返すメソッドです。

array = [1, 2, 3, 4]
array.include?(3)  #=> true
array.include?(5)  #=> false

str = "abcdef"  
str.include?("a") #=> true
str.include?("def") #=> true
str.include?("fgh") #=> false
str.include?("cba") #=> false
  #c,b,aはそれぞれ含まれているが"cba"という文字列は含まれていないため

includeメソッド

こちらは『クラス』に『モジュール』を"含ませる"ためのメソッドです。
念のため『クラス』と『モジュール』を簡単におさらい。

クラスとは

オブジェクトを作る設計図の事。形を持たず、概念のようなもの。
クラスにより生成されたオブジェクトはそのクラスの『インスタンス』と呼ばれる。
インスタンスはクラスに設定されたふるまい(メソッド)を使用できる。

 例えば「人間」がクラスとすると、『太郎さん』や『次郎さん』は「人間」クラスのインスタンスとなります。
 「人間」に(挨拶する)というメソッドが設定されているとすると、「太郎さん」も「次郎さん」も(挨拶する)というふるまいが出来ます。

class Human
  def hello
    puts "Hello!"
  end
end

tarousan = Human.new
jirousan = Human.new

tarousan.hello #=>Hello!
jirousan.hello #=>Hello!

モジュールとは

モジュールも設計図ですが、こちらは『インスタンス』を生成出来ません。
どういう時に使うかというと、「クラス」は別だが共通のふるまい(メソッド)を持たせたい時に使います。

 例えば「人間」クラスとは別に「犬」クラスがあったとして、「犬」クラスのインスタンスである『ハチ』は(挨拶する)というふるまいは出来ませんが、「人間」クラスの『太郎さん』や『次郎さん』のように(走る)というふるまいが出来ます。

 ではこの(走る)メソッドはどこに記述すればいいかですが、「人間」クラスにも「犬」クラスにも(走る)メソッドを書くのは面倒です。(今後「猫」クラスや「馬」クラスを作るとなった際にも書く事になるため)

 そこで(走る)というふるまいはモジュールにしてしまおうという事です。

module Running
  def run
    puts "dash"
  end
end

モジュールをクラスに追加する

ようやく話が戻りますが、このモジュールをクラスに追加する時に使うメソッドがincludeメソッドです。
上記のRunningというモジュールを「人間」クラスと「犬」クラスに追加します。

class Human
  include Running #モジュールを追加
  def hello
    puts "Hello!"
  end
end

class Dog
  include Running  #モジュールを追加
end

tarousan = Human.new
jirousan = Human.new

hachi = Dog.new

tarousan.run #=> dash
jirousan.run #=> dash
hachi.run #=> dash

『ハチ』は『太郎さん』や『次郎さん』とは違うクラスで生成されたインスタンスですが、同じ(走る)というふるまいをすることが出来ました。

以上。どなたかの参考になれば幸いです😊