initializeメソッドについて

#はじめに
「TECH CAMP エンジニア転職(旧名"TECH::EXPERT エンジニアクラス"）」に参加して数日、毎朝のドリルで出てきた課題を受ける中で、すっかり存在を忘れていたinitializeメソッド。
知識として定着させるために、一旦ここでまとめておこうと思い投稿しました。
（初投稿でドキドキです（笑））

##initializeメソッドとは
クラスからインスタンスを作成する際に、インスタンスができたタイミングで実行される処理。です。

クラスはよく"設計図"って言われているやつですね。
（これについても後日備忘録としてまとめたい）

つまり、設計図からモノを作成するタイミングで、initializeメソッドに書かれた内容を実行しちゃう。
お節介焼きなメソッドってことですね。

##今回の出題内容
今回の出題内容はこんな感じ（さすがにちょっとアレンジしています）

```ruby:drill.rb
class  Profile

  def initialize(part, genre, gear)
    @part = part
    @genre = genre
    @gear = gear
  end

end
```

上記のコードを修正して、以下の出力結果を得られるようにしてください。

```ruby:出力結果
パート: ドラム
好きなジャンル: Funk
自慢の楽器: sonorのスネア！（ローン返済中）
```

##実際に解こうとした時の考え

なにをすれば実装が実現できるかをまず整理してみた。

- まずは、インスタンス変数に引数で値を渡してあげないといけない
- そのためにはまずインスタンスを生成して、インスタンスメソッドを実行する時に引数を渡せばいい！

結果 -> エラーでしたｗ
<img width="652" alt="スクリーンショット 2020-03-04 17.32.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593458/f9b98a7a-2f35-7e45-d0b0-62c482462b0f.png">


書いたソースはこんな感じ

```Ruby:shareMyGear.rb(エラーになったソースコード）
class Profile
  def initialize(part, genre, gear)
    @part = part
    @genre = genre
    @gear = gear
  end

  def review #出力するためのインスタンスメソッド"review"を実装
    #initializeメソッドで定義されたインスタンス変数を式展開を使って出力。
    puts "パート: #{@part}"
    puts "好きなジャンル: #{@genre}"
    puts "自慢の楽器: #{@gear}"
  end
end

#クラスメソッドに渡すために、それぞれの変数に値を格納
part = "ドラム"
genre = "Funk"
gear = "sonorのスネア！（ローン返済中）"

#Profileクラスを　drummerとしてインスタンス化
drummer = Profile.new
#クラスメソッドのreviewに用意した変数を渡してあげる。
drummer.review(part, genre, gear)
```

##なぜエラーになったのか
エラーをみると、initializeについて書かれている。
**こういう時はググってみるのが一番。**
ということでググって以下のページにたどり着きました。

>検索ワード：ruby インスタンス 生成 initialize
>https://www.sejuku.net/blog/21170
newとinitializeの関係 の部分

そこにはこんな記述がありました。
**newメソッドに渡した引数がinitializeメソッドの引数nameとして渡されています。**

つまり、**インスタンスを生成するnewメソッドのタイミングで引数を指定してあげる必要がある**訳だな！
そんなこんなで、以下箇所を修正しました。

```ruby:インスタンス生成のソースコードを修正
#修正前
drummer = Profile.new
drummer.review(part, genre, gear)

#修正後
drummer = Profile.new(part, genre, gear)
drummer.review
```

実行したら・・・成功！

##何が悪かった？
drummerという~~インスタンス変数~~ インスタンスを作るタイミングで  ~~initialized~~ initializeメソッドが走る。(scivolaさん。ご指摘ありがとうございます！）
けど、修正前の記述だとinitializeメソッド（以後、initialize君と呼びます）は、以下の反応を示すみたいです。

>initialize君「よっしゃ！インスタンス生成するんだな！」
initialize君「・・・ぇ、でも待って。初期値として用意したいpart, genre,gearの中身をもらってないよ！？」

↓
エラー。

なので、インスタンス化するタイミングで一緒に引数を渡してあげるように記載を修正
すると・・・
>initialize君「よっしゃ！インスタンス生成するんだな！」
initialize君「おっしゃ、part, genre,gearの3つの変数もらったで。初期値としてインスタンス変数に突っ込んでおくやで」

↓
無事処理が走る！

**ご指摘いただいた部分の追記**
結果、ローカル変数の"drummer"に出来上がった Profile のインスタンスが代入される!


##最終的な回答
ググった結果を反映。以下のソースで実装成功！

```ruby
class Profile
  def initialize(part, genre, gear)
    @part = part
    @genre = genre
    @gear = gear
  end
  def review
    puts "パート: #{@part}"
    puts "好きなジャンル: #{@genre}"
    puts "自慢の楽器: #{@gear}"
  end
end

part = "ドラム"
genre = "Funk"
gear = "sonorのスネア！（ローン返済中）"

#-------------------
# ↓もし、ターミナルとかで入力した値を反映したいなら
# puts "バンドであなたは何を担当していますか？"
# part = gets.chomp
# puts "あなたの好きなジャンルは何ですか？"
# genre = gets.chomp
# puts "あなたの自慢の楽器を教えてください"
# gear = gets.comp
#-------------------


drummer = Profile.new(part, genre, gear)
drummer.review
```

##覚えておかないといけないこと
initializeメソッドが存在している場合は、**インスタンスを作るタイミングで引数を設定しなければならない！**


#最後に
もし、解釈間違いがあれば遠慮なく指摘していただけますと幸いですm(_ _)m
読んでいただきありがとうございました。