Ruby Silver 試験対策ポイントメモ

Ruby Silver (正式名称：Ruby Association Certified Ruby Programmer Silver version 3) の試験に向けた勉強メモです。

Ruby Silver受験を考えている方の参考になれば幸いです🤗

## 試験の概要

- 試験時間：90 分
- 試験方法：コンピュータ試験（CBT：Computer Based Testing）
- 問題数（方式）：50 問（選択式）
- 合格ライン：75 %
- 対象バージョン：Ruby 3.1.x
- 出題範囲
    - 文法
        - コメント
        - リテラル（数値、真偽値、文字列、文字、配列、ハッシュ等）
        - 変数/定数とスコープ
        - 演算子
        - 条件分岐
        - ループ
        - 例外処理
        - メソッド呼び出し
        - ブロック
        - メソッド定義
        - クラス定義
        - モジュール定義
        - キーワード引数
    - 組み込みライブラリ
        - よく使用されるクラス、モジュール（Object、数値クラス、String、Array、Hash、Kernel、Enumerable、Comparable等）
    - オブジェクト指向
        - ポリモルフィズム
        - 継承
        - mix-in
- 料金：16,500円(税込)

詳細な試験情報はこちらを確認してください。
https://www.ruby.or.jp/ja/certification/examination/

## `!` がつかない破壊的メソッド

- `concat`: 文字列や配列を破壊的に結合
- `replace`: 文字列や配列の内容を引数で与えられたものに置き換える
- `delete`: 配列から指定した要素を破壊的に削除
- `delete_if`: 条件に一致する要素を破壊的に削除
- `clear`: 配列のすべての要素を破壊的に削除
- `pop`: 配列の末尾の要素を破壊的に取り除く（LIFO: Last In First Out）
- `push`: 配列の末尾に要素を破壊的に追加（LIFO: Last In First Out）
- `shift`: 配列の先頭の要素を破壊的に取り除く（FIFO: First In First Out）
- `unshift`: 配列の先頭に要素を破壊的に追加（FIFO: First In First Out）


## 別名メソッド

- `delete_if` と `reject!`: 条件に一致する要素を削除（破壊的）
- `update` と `merge!`: ハッシュの内容を他のハッシュで更新（破壊的）
- `find_all` と `select`: 条件に一致する要素を返す
- `collect` と `map`: 各要素に対して処理を行い、新しい配列を作成
- `member?` と `include?`: 指定した要素が含まれているかを確認
- `find` と `detect`: 条件に一致する最初の要素を返す
- `length` と `size`: 配列やハッシュの要素数を返す


## DirとFileのメソッド比較

`Dir`と`File`クラスで、どっちのクラスにどのメソッドがあるか。

### `Dir`にのみ存在

- `pwd`: 現在の作業ディレクトリのパスを返す
- `home`: ユーザーのホームディレクトリのパスを返す
- `rmdir`: 指定されたディレクトリを削除する（空のディレクトリのみ）

### `File`にのみ存在

- `directory?`: 指定されたパスがディレクトリであるかを判定する
- `chmod`: 指定したファイルのアクセス権限を変更する
- `chown`: 指定されたファイルの所有者とグループを変更する
- `extname`: 指定されたファイルの拡張子を返す

### 共通

- `delete`:
    - `Dir.delete`は空のディレクトリのみを削除でき、
    - `File.delete`はファイルを削除する


## ファイルのモード

`File.open`メソッドの第2引数に指定する、ファイルを開くモード。

- `r`: 読み込みモード
- `w`: 書き込みモード
  - 既存ファイルの場合はファイルの内容を空にする
- `a`: 追記モード
  - 常にファイルの末尾に追加される
- `r+`: 読み書きモード
  - ファイルの読み書き位置が先頭になる
- `w+`: 読み書きモード
  - `r+`と同じだが、既存ファイルの場合はファイルの内容を空にする
- `a+`: 読み書きモード
  - ファイルの読み込み位置は先頭に、書き込み位置は常に末尾になる

## 文字列を取り除くメソッド
- `strip`: 文字列の先頭と末尾の空白文字（`\t`, `\r`, `\n`, `\f`, `\v`）を取り除く
- `strip!`: 破壊的に文字列の先頭と末尾の空白文字を取り除く
- `chomp`: 末尾の改行コードを取り除く
- `chop`: 末尾の文字を1文字取り除く。末尾が `\r\n` であれば、両方を取り除く

## `strftime`メソッドで使用できるフォーマット文字列

Rubyの`strftime`メソッドは、日付や時刻のフォーマットに使用する文字列指定があります。
他の言語と違い、間違えやすいと感じた部分は以下です。

- 小文字の`%m`が月（Month）、大文字の`%M`が分（Minute）
- `%I`は12時間制の時刻、`%H`は24時間制の時刻
- 小文字の`%h`は存在しない

### 日付に関するフォーマット文字列
| フォーマット | 説明                                    | 例         |
|--------------|-----------------------------------------|------------|
| `%a`         | 曜日の省略名（Sun, Mon, ...）           | "Sun"      |
| `%A`         | 曜日のフルスペル                        | "Sunday"   |
| `%b`         | 月の省略名（Jan, Feb, ...）              | "Jan"      |
| `%B`         | 月のフルスペル                          | "January"  |
| `%d`         | 日（01-31）                             | "05"       |
| `%e`         | 日（先頭のゼロを含まない）               | "5"        |
| `%j`         | 1年の通算日（001-366）                   | "123"      |
| `%m`         | 月（01-12）                             | "09"       |
| `%U`         | 年の週番号（週の始まりが日曜日の場合）    | "42"       |
| `%W`         | 年の週番号（週の始まりが月曜日の場合）    | "42"       |
| `%w`         | 曜日（0=日曜日, 1=月曜日, ...）          | "0"        |
| `%x`         | 日付（ロケールに依存）                  | "09/28/23" |
| `%D`         | 日付（%m/%d/%y と同じ）                 | "09/28/23" |
| `%y`         | 西暦の下2桁（00-99）                    | "23"       |
| `%Y`         | 西暦の4桁（0000-9999）                  | "2023"     |

### 時間に関するフォーマット文字列
| フォーマット | 説明                                    | 例         |
|--------------|-----------------------------------------|------------|
| `%H`         | 24時間制の時（00-23）                   | "14"       |
| `%I`         | 12時間制の時（01-12）                   | "02"       |
| `%M`         | 分（00-59）                             | "45"       |
| `%S`         | 秒（00-59）                             | "09"       |
| `%p`         | 午前/午後（AM/PM）                      | "PM"       |
| `%Z`         | タイムゾーン名                          | "UTC"      |
| `%z`         | タイムゾーンのオフセット                | "+0900"    |
| `%X`         | 時刻（ロケールに依存）                  | "14:45:09" |
| `%r`         | 12時間制の時刻（%I:%M:%S %p）           | "02:45 PM" |
| `%T`         | 時刻（%H:%M:%S）                        | "14:45:09" |

### その他のフォーマット文字列
| フォーマット | 説明                                    | 例                           |
|--------------|-----------------------------------------|------------------------------|
| `%c`         | 日時（ロケールに依存）                  | "Sun Sep 28 14:45:09 2023"    |
| `%%`         | パーセントリテラル（% を出力）           | "%"                           |
## ヒアドキュメント

- <<識別子: 変数展開あり、改行含む
- <<'識別子': 変数展開なし、改行含む
- <<-識別子: 変数展開あり、終了識別子のインデント許可、改行含む
- <<~識別子: 変数展開あり、インデント除去、改行含む


## 無事に合格しました

無事に82点で合格出来ました🥳


## 参考
- https://docs.ruby-lang.org/ja/latest/doc/index.html
- https://qiita.com/k-penguin-sato/items/ab2267ca99d5aedcc40a
- https://qiita.com/jawajawa/items/a460204044931f18f97f
- https://qiita.com/y_tanaka05/items/7a8c956331e0ebfffcf0