本書は、プログラミング言語Rubyの言語仕様や開発の現場で役立つRubyの知識を説明した本です。豊富なサンプルコードで文法を学び、例題でプログラミングの流れを体験できます。第1版(2017年11月発行)は、初心者の目線にたった丁寧な解説が好評で多くのRuby初学者に愛読され、いまやRuby入門書の定番とも言える存在です。2020年末のRuby 3.0のリリースに伴い、全章にわたって記述内容を見直し、Ruby 3.0までの変更点や新機能に合わせて加筆・修正を行いました。また、第1版にて読者から「難しい、わかりづらい」という声の多かったトピックの説明を改善するなど、より初心者に親切な内容に刷新しています。
第1章 本書を読み進める前に
1.1 イントロダクション
1.1.1 この章で説明すること
1.2 本書の概要
1.2.1 対象となる読者
1.2.2 本書で説明する内容と説明しない内容
1.2.3 Railsアプリの開発にも本書は役に立つか?
1.2.4 本書の特徴と効果的な学習方法
1.2.5 対象となるRubyのバージョン
1.3 Rubyについて
1.3.1 Rubyってどんなプログラミング言語?
1.3.2 Rubyの処理系
1.3.3 Rubyのライセンス
1.3.4 Ruby 3.0について
1.4 Rubyのインストール
1.4.1 macOS/Linuxの場合
1.4.2 Windowsの場合
1.4.3 その他の方法
1.4.4 サンプルコードの動作確認環境について
1.5 エディタ/IDEについて
1.5.1 エディタやIDEで不可欠な機能や設定
1.6 Rubyを動かしてみる
1.6.1 本書のサンプルコードとその表示例について
1.6.2 ファイルに保存したRubyプログラムを実行する
1.7 本書のサンプルコードについて
1.7.1 サンプルコードがうまく動かない場合
1.8 Rubyの公式リファレンスについて
1.9 この章のまとめ
第2章 Rubyの基礎を理解する
2.1 イントロダクション
2.1.1 この章の例題:FizzBuzzプログラム
2.1.2 FizzBuzzプログラムの実行例
2.1.3 この章で学ぶこと
2.2 Rubyに関する基礎知識
2.2.1 すべてがオブジェクト
2.2.2 メソッド呼び出し
2.2.3 文の区切り
2.2.4 コメント
2.2.5 識別子と予約語
2.2.6 空白文字
2.2.7 リテラル
2.2.8 変数(ローカル変数)の宣言と代入
2.3 文字列
2.3.1 シングルクオートとダブルクオート
2.3.2 文字列の比較
2.4 数値
2.4.1 演算子による値の比較
2.4.2 演算子の優先順位
2.4.3 変数に格納された数値の増減
2.5 真偽値と条件分岐
2.5.1 Rubyの真偽値
2.5.2 論理演算子
2.5.3 if文
2.6 メソッドの定義
2.6.1 メソッドの戻り値
2.6.2 メソッド定義における引数の( )
2.7 例題:FizzBuzzプログラムを作成する
2.7.1 作業用のディレクトリとファイルを準備する
2.7.2 一番簡単なプログラムで動作確認する
2.7.3 fizz_buzzメソッドを作成する
2.8 文字列についてもっと詳しく
2.8.1 文字列はStringクラスのオブジェクト
2.8.2 %記法で文字列を作る
2.8.3 ヒアドキュメント(行指向文字列リテラル)
2.8.4 フォーマットを指定して文字列を作成する
2.8.5 その他、文字列作成のいろいろ
2.8.6 文字と文字列の違いはない
2.9 数値についてもっと詳しく
2.9.1 基数指示子を用いた整数リテラル
2.9.2 ビット演算
2.9.3 指数表現
2.9.4 数値クラスのあれこれ
2.10 真偽値と条件分岐についてもっと詳しく
2.10.1 &&や||の戻り値と評価を終了するタイミング
2.10.2 優先順位が低いand、or、not
2.10.3 unless文
2.10.4 case文
2.10.5 条件演算子(三項演算子)
2.11 メソッド定義についてもっと詳しく
2.11.1 デフォルト値付きの引数
2.11.2 ?で終わるメソッド
2.11.3 !で終わるメソッド
2.11.4 エンドレスメソッド定義(1行メソッド定義)
2.12 その他の基礎知識
2.12.1 ガベージコレクション(GC)
2.12.2 エイリアスメソッド
2.12.3 式(Expression)と文(Statement)
2.12.4 擬似変数
2.12.5 参照の概念を理解する
2.12.6 組み込みライブラリ、標準ライブラリ、gem
2.12.7 requireとrequire_relative
2.12.8 putsメソッド、printメソッド、pメソッド、ppメソッド
2.13 この章のまとめ
第3章 テストを自動化する
3.1 イントロダクション
3.1.1 この章で学ぶこと
3.1.2 「プログラマの三大美徳」
3.2 Minitestの基本
3.2.1 テストコードのひな形
3.2.2 本書で使用するMinitestの検証メソッド
3.2.3 テストコードの実行と結果の確認
3.2.4 テストが失敗した場合の実行結果
3.2.5 実行中にエラーが発生した場合の実行結果
3.3 FizzBuzzプログラムのテスト自動化
3.3.1 putsメソッドをテストコードに置き換える
3.3.2 プログラム本体とテストコードを分離する
3.4 この章のまとめ
第4章 配列や繰り返し処理を理解する
4.1 イントロダクション
4.1.1 この章の例題:RGBカラー変換プログラム
4.1.2 RGBカラー変換プログラムの実行例
4.1.3 この章で学ぶこと
4.2 配列
4.2.1 要素の変更、追加、削除
4.2.2 配列を使った多重代入
4.3 ブロック
4.3.1 参考:JavaScriptの繰り返し処理
4.3.2 Rubyの繰り返し処理
4.3.3 配列の要素を削除する条件を自由に指定する
4.3.4 ブロックパラメータとブロック内の変数
4.3.5 do ... end と {}
4.4 ブロックを使う配列のメソッド
4.4.1 map/collect
4.4.2 select/find_all/reject
4.4.3 find/detect
4.4.4 sum
4.4.5 &とシンボルを使ってもっと簡潔に書く
4.5 範囲(Range)
4.5.1 配列や文字列の一部を抜き出す
4.5.2 n以上m以下、n以上m未満の判定をする
4.5.3 case文で使う
4.5.4 値が連続する配列を作成する
4.5.5 繰り返し処理を行う
4.6 例題:RGB変換プログラムを作成する
4.6.1 to_hexメソッドを作成する
4.6.2 to_hexメソッドをリファクタリングする
4.6.3 to_intsメソッドを作成する
4.6.4 to_intsメソッドをリファクタリングする
4.6.5 to_intsメソッドをリファクタリングする(上級編)
4.7 配列についてもっと詳しく
4.7.1 さまざまな要素の取得方法
4.7.2 さまざまな要素の変更方法
4.7.3 配列の連結
4.7.4 配列の和集合、差集合、積集合
4.7.5 多重代入で残りの全要素を配列として受け取る、または無視する
4.7.6 1つの配列を複数の引数やwhen節の条件として展開する
4.7.7 メソッドの可変長引数
4.7.8 *で配列同士を非破壊的に連結する
4.7.9 ==で等しい配列かどうか判断する
4.7.10 %記法で文字列の配列を簡潔に作る
4.7.11 文字列を配列に変換する
4.7.12 配列にデフォルト値を設定する
4.7.13 配列にデフォルト値を設定する場合の注意点
4.7.14 ミュータブル? イミュータブル?
4.8 ブロックについてもっと詳しく
4.8.1 添え字付きの繰り返し処理
4.8.2 with_indexメソッドを使った添え字付きの繰り返し処理
4.8.3 添え字を0以外の数値から開始させる
4.8.4 配列がブロックパラメータに渡される場合
4.8.5 番号指定パラメータ
4.8.6 ブロックローカル変数
4.8.7 繰り返し処理以外でも使用されるブロック
4.8.8 do...endと{}の結合度の違い
4.8.9 ブロックを使うメソッドを定義する
4.9 範囲(Range)についてもっと詳しく
4.9.1 終端や始端を持たない範囲オブジェクト
4.10 さまざまな繰り返し処理
4.10.1 timesメソッド
4.10.2 uptoメソッドとdowntoメソッド
4.10.3 stepメソッド
4.10.4 while文とuntil文
4.10.5 for文
4.10.6 loopメソッド
4.10.7 再帰呼び出し
4.11 繰り返し処理用の制御構造
4.11.1 break
4.11.2 throwとcatchを使った大域脱出
4.11.3 繰り返し処理で使うbreakとreturnの違い
4.11.4 next
4.11.5 redo
4.12 この章のまとめ
第5章 ハッシュやシンボルを理解する
5.1 イントロダクション
5.1.1 この章の例題:長さの単位変換プログラム
5.1.2 長さの単位変換プログラムの実行例
5.1.3 この章で学ぶこと
5.2 ハッシュ
5.2.1 要素の追加、変更、取得
5.2.2 ハッシュを使った繰り返し処理
5.2.3 ハッシュの同値比較、要素数の取得、要素の削除
5.3 シンボル
5.3.1 シンボルと文字列の違い
5.3.2 シンボルの特徴とおもな用途
5.4 続・ハッシュについて
5.4.1 ハッシュのキーにシンボルを使う
5.4.2 キーや値に異なるデータ型を混在させる
5.4.3 メソッドのキーワード引数とハッシュ
5.5 例題:長さの単位変換プログラムを作成する
5.5.1 テストコードを準備する
5.5.2 いろんな単位を変換できるようにする
5.5.3 convert_lengthメソッドを改善する
5.6 ハッシュとキーワード引数についてもっと詳しく
5.6.1 ハッシュで使用頻度の高いメソッド
5.6.2 **でハッシュを展開させる
5.6.3 ハッシュを使った擬似キーワード引数
5.6.4 任意のキーワードを受け付ける**引数
5.6.5 ハッシュを明示的にキーワード引数に変換する**
5.6.6 メソッド呼び出し時の{}の省略
5.6.7 ハッシュリテラルの{}とブロックの{}
5.6.8 ハッシュから配列へ、配列からハッシュへ
5.6.9 ハッシュのデフォルト値を理解する
5.6.10 その他、キーワード引数に関する高度な話題
5.7 シンボルについてもっと詳しく
5.7.1 シンボルを作成するさまざまな方法
5.7.2 %記法でシンボルやシンボルの配列を作成する
5.7.3 シンボルと文字列の関係
5.8 この章のまとめ
第6章 正規表現を理解する
6.1 イントロダクション
6.1.1 この章の例題:ハッシュ記法変換プログラム
6.1.2 ハッシュ記法変換プログラムの実行例
6.1.3 この章で学ぶこと
6.2 正規表現って何?
6.2.1 正規表現の便利さを知る
6.2.2 正規表現をゼロから学習するための参考資料
6.3 Rubyにおける正規表現オブジェクト
6.3.1 Rubularで視覚的にマッチする文字列を確認する
6.3.2 正規表現のキャプチャを利用する
6.3.3 キャプチャに名前を付ける
6.3.4 組み込み変数でマッチの結果を取得する
6.3.5 正規表現と組み合わせると便利なStringクラスのメソッド
6.4 例題:Rubyのハッシュ記法を変換する
6.4.1 テストコードを準備する
6.4.2 ハッシュ記法変換プログラムを実装する
6.5 正規表現オブジェクトについてもっと詳しく
6.5.1 正規表現オブジェクトを作成するさまざまな方法
6.5.2 case文で正規表現を使う
6.5.3 正規表現オブジェクト作成時のオプション
6.5.4 Regexp.last_matchでマッチの結果を取得する
6.5.5 組み込み変数を書き換えないmatch?メソッド
6.6 この章のまとめ
第7章 クラスの作成を理解する
7.1 イントロダクション
7.1.1 この章の例題:改札機プログラム
7.1.2 この章で学ぶこと
7.2 オブジェクト指向プログラミングの基礎知識
7.2.1 クラスを使う場合と使わない場合の比較
7.2.2 オブジェクト指向プログラミング関連の用語
7.3 クラスの定義
7.3.1 オブジェクトの作成とinitializeメソッド
7.3.2 インスタンスメソッドの定義
7.3.3 インスタンス変数とアクセサメソッド
7.3.4 クラスメソッドの定義
7.3.5 定数
7.4 例題:改札機プログラムの作成
7.4.1 テストコードを準備する
7.4.2 必要なメソッドやクラスを仮実装する
7.4.3 運賃が足りているかどうかを判別する
7.4.4 テストコードのリファクタリング
7.4.5 残りのテストケースをテストする
7.5 selfキーワード
7.5.1 selfの付け忘れで不具合が発生するケース
7.5.2 クラスメソッドの内部やクラス構文直下のself
7.5.3 クラスメソッドをインスタンスメソッドで呼び出す
7.6 クラスの継承
7.6.1 標準ライブラリの継承関係
7.6.2 デフォルトで継承されるObjectクラス
7.6.3 オブジェクトのクラスを確認する
7.6.4 ほかのクラスを継承したクラスを作る
7.6.5 superでスーパークラスのメソッドを呼び出す
7.6.6 メソッドのオーバーライド
7.6.7 クラスメソッドの継承
7.7 メソッドの可視性
7.7.1 publicメソッド
7.7.2 privateメソッド
7.7.3 privateメソッドから先に定義する場合
7.7.4 privateメソッドはサブクラスでも呼び出せる
7.7.5 クラスメソッドをprivateにしたい場合
7.7.6 メソッドの可視性を変える方法あれこれ
7.7.7 protectedメソッド
7.8 定数についてもっと詳しく
7.8.1 定数と再代入
7.8.2 定数はミュータブルなオブジェクトに注意する
7.9 さまざまな種類の変数
7.9.1 クラスインスタンス変数
7.9.2 クラス変数
7.9.3 グローバル変数と組み込み変数
7.10 クラス定義やRubyの言語仕様に関する高度な話題
7.10.1 エイリアスメソッドの定義
7.10.2 メソッドの削除
7.10.3 入れ子になったクラスの定義
7.10.4 演算子の挙動を独自に再定義する
7.10.5 等値を判断するメソッドや演算子を理解する
7.10.6 オープンクラスとモンキーパッチ
7.10.7 特異メソッド
7.10.8 クラスメソッドは特異メソッドの一種
7.10.9 ダックタイピング
7.11 この章のまとめ
第8章 モジュールを理解する
8.1 イントロダクション
8.1.1 この章の例題:rainbowメソッド
8.1.2 この章で学ぶこと
8.2 モジュールの概要
8.2.1 モジュールの用途
8.2.2 モジュールの定義
8.3 モジュールを利用したメソッド定義(includeとextend)
8.3.1 モジュールをクラスにincludeする
8.3.2 include先のメソッドを使うモジュール
8.3.3 モジュールをextendする
8.4 例題:rainbowメソッドの作成
8.4.1 実装の方針を検討する
8.4.2 テストコードを準備する
8.4.3 rainbowメソッドを実装する
8.4.4 rainbowメソッドのリファクタリング
8.4.5 あらゆるオブジェクトでrainbowメソッドを使えるようにする
8.5 モジュールを利用したメソッド定義についてもっと詳しく
8.5.1 includeされたモジュールの有無を確認する
8.5.2 Enumerableモジュール
8.5.3 Comparableモジュールと演算子
8.5.4 Kernelモジュール
8.5.5 トップレベルはmainという名前のObject
8.5.6 クラスやモジュール自身もオブジェクト
8.5.7 モジュールとインスタンス変数
8.5.8 クラス以外のオブジェクトにextendする
8.6 モジュールを利用した名前空間の作成
8.6.1 名前空間を分けて名前の衝突を防ぐ
8.6.2 名前空間でグループやカテゴリを分ける
8.6.3 入れ子なしで名前空間付きのクラスを定義する
8.6.4 トップレベルの同名クラスを参照する
8.6.5 入れ子の有無によって参照されるクラスが異なるケース
8.7 関数や定数を提供するモジュールの作成
8.7.1 モジュールに特異メソッドを定義する
8.7.2 module_functionメソッド
8.7.3 モジュールに定数を定義する
8.7.4 モジュール関数や定数を持つモジュールの例
8.8 状態を保持するモジュールの作成
8.9 モジュールに関する高度な話題
8.9.1 メソッド探索のルールを理解する
8.9.2 モジュールにほかのモジュールをincludeする
8.9.3 prependでモジュールをミックスインする
8.9.4 prependで既存メソッドを置き換える
8.9.5 有効範囲を限定できるrefinements
8.10 この章のまとめ
第9章 例外処理を理解する
9.1 イントロダクション
9.1.1 この章の例題:正規表現チェッカープログラム
9.1.2 正規表現チェッカーの実行例
9.1.3 この章で学ぶこと
9.2 例外の捕捉
9.2.1 発生した例外を捕捉しない場合
9.2.2 例外を捕捉して処理を続行する場合
9.2.3 例外処理の流れ
9.2.4 例外オブジェクトから情報を取得する
9.2.5 クラスを指定して捕捉する例外を限定する
9.2.6 例外クラスの継承関係を理解する
9.2.7 継承関係とrescue節の順番に注意する
9.2.8 例外発生時にもう一度処理をやりなおすretry
9.3 意図的に例外を発生させる
9.4 例外処理のベストプラクティス
9.4.1 安易にrescueを使わない
9.4.2 rescueしたら情報を残す
9.4.3 例外処理の対象範囲と対象クラスを極力絞り込む
9.4.4 例外処理よりも条件分岐を使う
9.4.5 予期しない条件は異常終了させる
9.4.6 例外処理も手を抜かずにテストする
9.5 例題:正規表現チェッカープログラムの作成
9.5.1 テスト駆動開発をするかどうか
9.5.2 実装のフローチャートを考える
9.5.3 文字入力を受け付けるgetsメソッド
9.5.4 実装を開始する
9.5.5 例外処理を組み込む
9.6 例外処理についてもっと詳しく
9.6.1 ensure
9.6.2 ensureの代わりにブロックを使う
9.6.3 例外処理のelse
9.6.4 例外処理と戻り値
9.6.5 begin/endを省略するrescue修飾子
9.6.6 $!と$@に格納される例外情報
9.6.7 例外処理のbegin/endを省略できるケース
9.6.8 rescueした例外を再度発生させる
9.6.9 独自の例外クラスを定義する
9.7 この章のまとめ
第10章 yieldとProcを理解する
10.1 イントロダクション
10.1.1 この章の例題:ワードシンセサイザー
10.1.2 この章で学ぶこと
10.2 ブロックを利用するメソッドの定義とyield
10.2.1 yieldを使ってブロックの処理を呼び出す
10.2.2 ブロックを引数として明示的に受け取る
10.3 Procオブジェクト
10.3.1 Procオブジェクトの基礎
10.3.2 Procオブジェクトをブロックの代わりに渡す
10.3.3 Procオブジェクトを普通の引数として渡す
10.3.4 Proc.newとラムダの違い
10.3.5 Proc.newかラムダかを判断するlambda?メソッド
10.4 例題:ワードシンセサイザーの作成
10.4.1 エフェクトの実装方法を検討する
10.4.2 テストコードも2つに分ける
10.4.3 テストコードを準備する
10.4.4 リバースエフェクトを実装する
10.4.5 エコーエフェクトを実装する
10.4.6 ラウドエフェクトを実装する
10.4.7 WordSynthクラスの実装とテスト
10.5 Procオブジェクトについてもっと詳しく
10.5.1 Procオブジェクトを実行するさまざまな方法
10.5.2 &とto_procメソッド
10.5.3 Procオブジェクトとクロージャ
10.6 この章のまとめ
第11章 パターンマッチを理解する
11.1 イントロダクション
11.1.1 この章の例題:ログフォーマッタープログラム
11.1.2 この章で学ぶこと
11.2 パターンマッチの基本
11.2.1 ハッシュをパターンマッチさせる
11.3 パターンマッチの利用パターン
11.3.1 valueパターン
11.3.2 variableパターン
11.3.3 arrayパターン
11.3.4 hashパターン
11.3.5 asパターン
11.3.6 alternativeパターン
11.3.7 findパターン
11.4 例題:ログフォーマッターの作成
11.4.1 入力データの取得
11.4.2 “OK”のログに対応する
11.4.3 404エラーのログに対応する
11.4.4 “WARN”のログに対応する
11.4.5 500エラーのログに対応する
11.4.6 参考:パターンマッチを使わない場合
11.5 パターンマッチについてもっと詳しく
11.5.1 ガード式
11.5.2 1行パターンマッチ
11.5.3 変数のスコープに関する注意点
11.5.4 自作クラスをパターンマッチに対応させる
11.6 この章のまとめ
第12章 Rubyのデバッグ技法を身につける
12.1 イントロダクション
12.1.1 この章で学ぶこと
12.2 バックトレースの読み方
12.2.1 実行環境によって変化するバックトレースの表示形式
12.3 よく発生する例外クラスとその原因
12.3.1 NameError
12.3.2 NoMethodError
12.3.3 TypeError
12.3.4 ArgumentError
12.3.5 ZeroDivisionError
12.3.6 SystemStackError
12.3.7 LoadError
12.3.8 SyntaxError(syntax error)
12.3.9 組み込みライブラリに定義されている上記以外の例外クラス
12.3.10 Rubyの標準ライブラリに含まれない例外クラス
12.4 プログラムの途中経過を確認する
12.4.1 printデバッグ
12.4.2 tapメソッドでメソッドチェーンをデバッグする
12.4.3 ログにデバッグ情報を出力する
12.4.4 デバッガ(debug.gem)を使う
12.5 汎用的なトラブルシューティング方法
12.5.1 irb上で簡単なコードを動かしてみる
12.5.2 ログを調べる
12.5.3 公式ドキュメントや公式リファレンスを読む
12.5.4 issueを検索する
12.5.5 ライブラリのコードを読む
12.5.6 テストコードを書く
12.5.7 “警戒しながら”ネットの情報を参考にする
12.5.8 パソコンの前から離れる
12.5.9 誰かに聞く
12.6 この章のまとめ
第13章 Rubyに関するその他のトピック
13.1 イントロダクション
13.1.1 この章で学ぶこと
13.2 日付や時刻の扱い
13.3 ファイルやディレクトリの扱い
13.4 特定の形式のファイルを読み書きする
13.4.1 CSV
13.4.2 JSON
13.4.3 YAML
13.5 環境変数や起動時引数の取得
13.5.1 組み込み定数
13.6 非推奨機能を使ったときに警告を出力する
13.7 eval、バッククオートリテラル、sendメソッド
13.8 Rake
13.8.1 Rakeの基本的な使い方
13.8.2 Rakeを使ったテストの一括実行
13.9 gemとBundler
13.9.1 gemのインストールと利用方法
13.9.2 Bundlerでプロジェクト内で使用するgemを一括管理する
13.9.3 Gemfile.lockの役割
13.9.4 Gemfileでgemのバージョンを指定する記号の意味
13.10 Rubyにおける型情報の定義と型検査(RBS、TypeProf、Steep)
13.10.1 typeprofコマンドで型情報を自動生成する
13.10.2 Steepで型検査を行う
13.10.3 RBSとRubyの未来
13.11 「Railsの中のRuby」と「素のRuby」の違い
13.11.1 requireやrequire_relativeを書く機会がほとんどない
13.11.2 名前空間として使われるモジュールが自動生成される
13.11.3 標準ライブラリのクラスやMinitestが独自に拡張されている
13.11.4 Rubyの構文や言語機能がまったく別の用途で使われているケースがある
13.12 この章のまとめ