プロを目指す人のためのRuby入門を読んだ感想

Railsを学ぶ前にRubyの基礎を学ぶために、プロを目指す人のためのRuby入門を読みました。

www.amazon.co.jp

 

読んだ感想

内容としてはRubyの基本的な文法から、初心者からするといつ使うの?と疑問に思うような高度な知識まで網羅されていました。

分量があるので読み終えるのにかなり時間がかかりました。

Rubyの前にPHPJavaScriptを学んだことがあるのですが、その2つの言語にもないRubyの独自の書き方やルールが多いなと感じました。特にブロックやモンキーパッチなど。またreturnを書かないのは衝撃でした。

 

本の説明でもあったように、難しいところは頭の中にインデックスを作っておいて、必要になった時に読み返すという読み方が最善だなと思いました。クラス以降の章は特に難しいです。

 

良かった点は、テスト駆動で例題を解いていくのと、正規表現デバッグについて詳しく説明されているところです。

1つの章ごとに例題を解くのですが、その例題を解くときにテストを書きます。

わざとテストが失敗するコードを書いて、それをテストが通るコードに修正していくテスト駆動のやり方を学べました。

正規表現に関しては、他の言語でも共通の知識なのに、食わず嫌いというか、勝手に苦手意識を持って避けてきた部分なので、しっかり学ぶ機会ができて助かりました。

デバッグでは、エラーメッセージの読み方や、putsやpメソッドを使ったデバッグ方法、デバッガの使い方まで学べます。

 

学んだこと

新しく学んだことを箇条書きで書いていきます。

2章
  • Rubyは全てがオブジェクト(数値やniltrueなどに対してもメソッドを呼び出せる)

  • falsenilは偽として扱われ、それ以外はtrue

  • メソッドでreturnを使わないのが主流(最後に評価された式が戻り値となる)

  • メソッドに引数がないなら()を省略するのが主流

  • 文字列はすべてStringオブジェクト

  • 1文字でも複数文字でも文字列として扱う

  • 数値は値の種類によってクラスが異なる

  • case文を使うことで複数の値のどれかに一致すれば処理を実行するという条件分岐を描くことができる

  • メソッドを呼び出す時に引数の過不足があるとエラーになる

  • ?で終わるメソッドは真偽値を返すメソッド

  • Rubyでは使われなくなったオブジェクトを破棄して自動的にメモリを解放するガベージコレクションがあるため、メモリ管理を意識する必要はない

  • 変数にはオブジェクトそのものではなくオブジェクトへの参照が格納される

  • gem=外部ライブラリ

  • ライブラリを読み込むときはrequirerequire_relativeを使う

 

3章 テスト
  • プログラムの実行結果を自動でチェックするためにテスティングフレームワークを使ってテストを行う

  • わざとエラーになるテストコードを書くテストが成功するコードに修正する

 

4章 配列
  • 配列は複数のデータをまとめて格納するオブジェクトで、どんなオブジェクトでも格納できる

  • ブロックはメソッドの引数として渡すことができる処理のかたまり

  • Rubyで繰り返し処理を書くときはfor文ではなくeachメソッドを使うのが主流

  • ブロックはJavaScriptのコールバック関数のようなもの

  • ブロックはdo...endか{}のどちらかで書く

  • Rangeオブジェクトは文字列や数値の範囲を表すメソッド

  • Rangeオブジェクトは値...値のように書く

  • テスト駆動開発のサイクル

        1. 失敗するテストコードを書く

        2. テストが成功するような最小限のコードを書く

        3. リファクタリングする

  • 配列のメソッドはArrayクラスに定義されているものと、Enumerableモジュールに定義されている物に大別される

  • Rubyのthrow、catchは例外処理とは関係ない

  • breakを使うと繰り返し処理からの脱出、returnを使うとメソッドからの脱出になる

 

5章 ハッシュ・シンボル
  • ハッシュとはキーと値の組み合わせでデータを管理するオブジェクト

  • ハッシュはHashクラスのオブジェクト

  • {キー => 値}

  • シンボルは文字列と見た目がよく似ているが別物

  • :シンボル名

  • シンボルはSymbolクラスのオブジェクトで、Rubyの内部で整数として扱われる

  • シンボルは文字列より高速に比較できる

  • シンボルは同じものであれば全く同じオブジェクトであるので、文字列よりメモリの使用効率がよくなる

  • シンボルはイミュータブルなオブジェクトなので、勝手に値を変更されない
  • シンボルがよく使われるのはハッシュのキーのような、名前を識別したいが必ずしも文字列である必要はない時

     

6章 正規表現

 

7章 クラス
  • クラスは一種のデータ型である

  • メソッドを呼び出された側はレシーバという

  • オブジェクトごとに保持されるデータのことを状態(ステート)という

  • @で始まる変数はインスタンス変数で、同じクラスから生成されたインスタンスの内部で共有される変数

  • インスタンス変数はクラス外から参照できないため、参照用のメソッド(ゲッターメソッド)を作る必要がある

  • 外部からインスタンス変数の値を変更するメソッドをセッターメソッドという

  • セッターメソッドとゲッターメソッドを合わせてアクセサメソッドといい、attr_accessorというメソッドで省略できる

  • インスタンスで共通して使いたいメソッドはselfを使ってクラスメソッドとして定義する

  • Rubyではクラス名は定数の1つなのでクラスが見つからないというエラーは定数が見つからないという内容になる

  • メソッドの内部でクラスに定義されている他のメソッドを呼び出す場合は、暗黙的にselfに対してメソッドを呼び出している

  • Rubyでは継承できるクラスは1つだけ

  • すべてのオブジェクトはBasic Objectクラスを継承している

  • 継承元を指定しない場合はデフォルトでObjectクラスが継承される

  • 継承先のクラスで継承元のメソッドを使うにはsuperを使う

  • initializeメソッド以外のインスタンスメソッドはデフォルトではpublicメソッドになる

  • privateメソッドを定義するときはクラスの最後の方にまとめて記述することが多い

  • Rubyではサブクラスでもprivateメソッドを呼び出せる

  • クラスメソッドはprivateにできない

  • Rubyではメソッドの定義も値を返す(メソッド名をシンボルとして返す)

  • クラスの定数は外部から参照できる

  • メソッド内で定数を定義しようとするとエラーになる

  • Rubyの定数は変更しようと思えばいくらでも変更できる

  • Rubyでは機会は少ないが演算子もメソッドとして再定義できる

  • Rubyではクラスの継承に制限がない

  • Rubyのクラスはオープンクラスといって、変更に対してオープンなクラスである

  • 既存の実装を上書きして挙動を変更することをモンキーパッチという

  • オープンクラスやモンキーパッチに頼らずに要件を満たすコードを書くことを心がける

  • 特定のオブジェクトだけに紐づくメソッドのことを特異メソッドという

  • Rubyにはインターフェースはない

  • Rubyはクラスがなんであろうとメソッドを呼び出せるかどうかを気にする(ダックタイピング)

 

8章 モジュール
  • モジュールはクラスのようでクラスではない

  • 大規模なプログラムで利用する機会が多い

  • module モジュール名 endで定義する

  • モジュールからインスタンスは生成できず、他のモジュールから継承することもできない

  • 継承は使えないが共通の処理を書きたいときにモジュールを使える

  • モジュールをクラスにincludeすることをミックスインという

  • ミックスインによって多重継承に似た仕組みを書ける

  • モジュール内のメソッドをextendすることで特異メソッドとして扱える

  • Objectクラスには便利なモジュールがincludeされている

  • Enumerableモジュールは何かしらの繰り返し処理ができるクラスにincludeされているモジュール

  • Comparableモジュールは比較演算を可能にするモジュール

  • ObjectクラスがincludeしているKernelモジュールには最初から当たり前のように使えるメソッドが定義されている

  • Rubyではクラスやモジュールの構文に囲まれていない一番外側の部分をトップレベルといい、そこにはmainという名前のObjectクラスのインスタンスがselfとして存在している

  • モジュール自身もオブジェクト

  • モジュールの中でクラスを定義することで名前空間として利用できる

  • モジュールに自身に特異メソッドを定義することで、単なるメソッドの集まりを作ることができる

 

9章 例外処理
  • 例外とはプログラムの実行前または実行中に発生した例外的な問題のこと

  • 例外を適切に扱うことで堅牢なプログラムを書くことができ、エラーの調査がしやすくなったりする

  • 例外も例外クラスのインスタンスになっている

  • 例外が発生するまでのメソッドの呼び出し履歴をバックトレースという

  • 例外処理は基本的に`begin 例外が起きうる処理 rescue 例外が発生した場合の処理 end`と書く

  • 例外には様々な種類があってそれぞれでクラスが異なる

  • すべての例外クラスはExceptionクラスを継承している

  • StandardErrorクラスは通常のプログラムで発生する例外を表すクラス

  • StandardErrorクラスを継承していない例外クラスは特殊なエラーが起きたことを表す

  • 意図的に例外を発生させるにはraiseメソッドを使う

  • 安易にrescueを使わない、使う時はログを残すべき

  • Railsには最初から例外発生時の処理が組み込まれている

  • 例外処理より条件分岐の方が可読性やパフォーマンスが良い

  • 例外処理もテストを行うべき

 

12章 デバッグ
  • エラーを解決するにはバックトレースをよく読む

  • バックトレースはプログラムが実行されてエラーが発生するまでのメソッド呼び出し履歴のこと

  • バックトレースの主な内容

    • プログラムのファイルパス

    • ファイルの行番号

    • エラーが起きたメソッドの名前

    • エラーメッセージ

    • 例外クラス名

     

  • プログラムの実行順や変数の中身を確認するときは`puts`や`p`メソッドを使う

  • putsは戻り値がnilになり、pは引数が戻り値になる

  • デバッガを使うことで対話的にデバッグできる

 

13章 その他
  • DateTimeクラスは非推奨なので、Timeクラスを使う

  • Rubyや外部ライブラリを使うときは、セキュリティのためなるべく最新のものを使う

  • RuboCopを使うと書いたコードがRubyのコーディング規約に準拠しているかチェックしてくれる

  • RakeはRubyの何らかのまとまった処理を実行するためのツール

  • Ruby関連のツールではRubyで書かれた、人間にとって読みやすく機械にとっても処理がしやすいテキストファイルの記述ルールであるDSLがよく使われる

  • Rubyのライブラリはgemという形式でパッケージングされている

  • 大量のgemをどの環境でも同一のバージョンでインストールするためにBundlerを使う

  • Bundlerを使ってgemをインストールするとGemfileと同じディレクトリにGemfile.lockが作成される

  • Gemfile.lockはBundlerで管理するgemとそのバージョンが記載されており、直接編集してはいけない

  • 環境を揃えたい場合はGemfileとGemfile.lockをGitなどでバージョン管理してbundle installを実行するだけ

  • bundlerでgemをインストールする際にバージョンを指定しないと、Bundlerが依存関係上問題が起きない最新のバージョンをインストールする

  • Railsではrequireを自動で実行してくれるので書く機会は減る

 

まとめ

一通り読んで写経はしたのですが、理解が追いついている気はしないので、Railsを学んでアプリを作ってみてからもう一度読み直そうと思います。