初学者がRuby Silverに合格！勉強方法をまとめてみました！

現在オンラインスクールにてプログラム学習をしているMiyaki（@Miyaki）と申します。
初学者ゆえに、記事の内容に誤りや分かりにくい点があるかもしれませんがお許しください🙇‍♂️
Ruby Silverに合格しましたので、資格を取得するために実践した方法について共有させていただきます！

# 目次

<table>
  <thead>
    <tr>
      <th style="text-align: center;">章</th> <th>タイトル</th>
    </tr>
  </thead>
  <tr>
    <td style="text-align: center;">1</td> <td><a href="#勉強時間">勉強時間</a>　　　　　</td>
  <tr>
    <td style="text-align: center;">2</td> <td><a href="#学習教材">学習教材  
  </td>
  </tr>
  <tr>
    <td style="text-align: center;">3</td> <td><a href="#勉強方法">勉強方法  
  </td>
  </tr>
  <tr>
    <td style="text-align: center;">4</td> <td><a href="#学習メモ">学習メモ</td>
  </tr>
</table>


# 勉強時間
約40時間
アプリ制作の都合で資格勉強の時間をあまり確保できませんでしたが、並行して空いた日に1日1〜2時間ほどコツコツと勉強しました。
トータルで40時間ほど勉強しました。

# 学習教材

<a href="https://rex.libertyfish.co.jp/">RubyExamination(REx)</a> (無料)
GitHubアカウントとの連携をすることで使用できます。
受ける度に問題の2〜3割程度が変更されるため、答えを覚えてしまうという事態を防げます。
スマホでも利用できるため移動時間や隙間時間に学習できます。

<a href="https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%EF%BC%88Silver-Gold%E5%AF%BE%E5%BF%9C%EF%BC%89-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E4%BF%8A%E7%94%B7/dp/4297142163/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=249VXI97B64PS&dib=eyJ2IjoiMSJ9.y0y3GiFl8OoBTaJyQQwQE5sz1_ChwKd5Nmpyxegxq8Vi_FQ6dpcAPFYPvVpiLflzq1hV7GWhtMJGJUrbcRktvYqI8yELit5uzYETmoe01ndOL0C3obxywT7SI68OuKPI3CRhacCdbY5WOPl5qJ9YGbYALGn8PubXzdaN_1mJvprAHweT4oPDgxF5sRE7mJkjrg49KbijvlsV6fkr6iXBCboiOXR1VMHh_-ZQpmMZZgCzIi-xB6YTGfEZVv9CGQGeaq7NYSXro452lrs43cMk1VxYox81hMwzrRIPASnwgSA.WD4fwhXXdnPzCk6BXgRfcBxosiYFAhOfRm6Ze63Gyz0&dib_tag=se&keywords=%5B%E6%94%B9%E8%A8%822%E7%89%88%EF%BC%BDRuby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC&qid=1719423520&sprefix=%E6%94%B9%E8%A8%822%E7%89%88+ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC%2Caps%2C198&sr=8-2">Ruby技術者認定試験合格教本</a> (有料)
練習問題（各30問）、模擬試験（各50問）がついています。
個人的な印象では、ここでの問題が試験に多く出題されたように感じました。


<a href="https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0">模擬試験問題集</a> (無料)
GitHubに公開されている問題集で、50問あります。
難易度は比較的低めです。

# 勉強方法

#### 1　RExをひたすら解く
まずはRExの問題を集中的に解きました。最初の期間はRExの問題を解くことに集中し、問題形式や出題傾向に慣れることを目標としました。
平均で8割以上の得点が取れるまで何度も繰り返し解きました。
解説も書かれていますが、それでもよくわからない場合はChatGPTなどを活用して、なぜその答えになるのか理由まで理解しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634130/976a594c-1a07-7f19-96e7-9eb7732ceaa5.png)

#### 2　他の問題集を使用する
GitHub上で公開されている問題集や、Ruby技術者認定試験合格教本の問題集に取り組みました。
こちらはRExで8割以上取れるようになった後、試験形式で問題を解きました。
Ruby技術者認定試験合格教本は、問題集を解いた上で、不明な点のみリファレンスを参照して補足しました。


#### 3　Notionやメモにまとめる
Notionやメモ機能を活用して、自分が間違えた問題や理解できていない問題をまとめ、一気に解き直しました。こうすることで、いつでも見直せるようになり、自分の弱点を効率的に復習することができました。

# 学習メモ
学習中に記録したメモから、いくつかピックアップして紹介します！

### |　||　&　&&の違い

#### |　
二つの配列を結合し、重複する要素を一つにまとめて出力します
```Ruby
a = [1, 2, 3]
b = [1, 3, 5]
a | b  # => [1, 2, 3, 5]
```

#### ||

左辺が真の場合、右辺の評価は行われず、左辺の値が返されます
左辺が偽の場合、右辺の値が返されます
```Ruby
a = [1, 2, 3]
b = [1, 3, 5]
a || b  # => [1, 2, 3]

a = nil
b = [1, 3, 5]
a || b  # => [1, 3, 5]

a = nil
b = false
a || b  # => false
```

#### &
二つの配列の中で共通する要素のみを取り出して出力します
```Ruby
a = [1, 2, 3]
b = [1, 3, 5]
a & b  # => [1, 3]
```

#### &&
左辺が真の場合、右辺の値が返されます
左辺が偽の場合、右辺の評価は行われず、左辺の値が返されます
```Ruby
a = [1, 2, 3]
b = [1, 3, 5]
a && b  # => [1, 3, 5]

a = [1, 2, 3]
b = false
a && b  # => false

a = nil
b = [1, 3, 5]
a && b  # => nil
```



### equal? eql? == の違い

#### equal?
オブジェクトIDが同一かどうかを比較します
オブジェクトが完全に同じ場合にのみtrueを返します

```Ruby
a = "hello"
b = "hello"
c = a

puts a.equal?(b)   # => false（異なるオブジェクト）
puts a.equal?(c)   # => true（同じオブジェクト）
```
#### eql?
オブジェクトの内容と型が同じかどうかを比較します
```Ruby
a = 1           # => Integer型
b = 1.0         # => Float型

puts a.eql?(b)  # => false（異なる型）
```
#### ==
オブジェクトの内容が同じかどうかを比較します
```Ruby
a = 1           # => Integer型
b = 1.0         # => Float型

puts a == b     # => true（数値的に同じ値）
```

### ヒアドキュメントの終了識別子

```Ruby
text = <<EOF
    Hello,
    Ruby
EOF
p text      # => "    Hello,\n    Ruby\n"
```
終了識別子 (EOF) は行の先頭に配置する必要があります
終了識別子 (EOF) の前にインデントがあると正しく認識されません

```Ruby
text = <<-EOF
    Hello,
    Ruby
    EOF
p text       # => "    Hello,\n    Ruby\n"
```
<<-EOF を使用すると、終了識別子 (EOF) の前のインデントが無視されます
終了識別子 (EOF) の前にインデントがあっても正しく認識されます

```Ruby
text = <<~EOF
    Hello,
    Ruby
    EOF
p text      # => "Hello,\nRuby\n"
```
<<~EOF を使用すると、全てのインデントが取り除かれます
終了識別子 (EOF) の前にインデントがあっても正しく認識されます

```Ruby
text = <<ABCDE
    Hello,
    Ruby
ABCDE
p text      # => "    Hello,\n    Ruby\n"
```
※EOFの部分は任意の識別子を使用することもできます

### 同じメソッド
mapとcollect
配列の各要素にブロックを適用し、新しい配列を返す
```Ruby
[1, 2, 3].map { |x| x * 2 }    # => [2, 4, 6]
[1, 2, 3].collect { |x| x * 2 } # => [2, 4, 6]
```

detectとfind
配列の中で条件に一致する最初の要素を返す
```Ruby
[1, 2, 3, 4].detect { |x| x.even? }  # => 2
[1, 2, 3, 4].find { |x| x.even? }    # => 2
```

selectとfind_all
条件に一致するすべての要素を配列として返す
```Ruby
[1, 2, 3, 4].select { |x| x.even? }    # => [2, 4]
[1, 2, 3, 4].find_all { |x| x.even? }  # => [2, 4]
```

updateとmerge!
ハッシュの内容を破壊的に更新する
```Ruby
hash1 = { a: 1, b: 2 }
hash2 = { b: 3, c: 4 }
hash1.update(hash2)  # => { a: 1, b: 3, c: 4 }
hash1.merge!(hash2)  # => { a: 1, b: 3, c: 4 }
```

lengthとsize
配列や文字列の長さを返す
```Ruby
[1, 2, 3].length  # => 3
[1, 2, 3].size    # => 3
"hello".length    # => 5
"hello".size      # => 5
```

## 最後に
ここまで読んでいただきありがとうございます。Ruby Silverの受験を通じて多くのメソッドや新しい知識を得ることができ、とても自信がつきました！
初学者の方は、RubyやRailsを学ぶ際に基礎を固めるためにも、ぜひ挑戦してみてください。
この記事が、これから同じ目標を目指す方々のお役に立てれば幸いです。