しぐまろぐ

勉強したことや読んだ本について書きます。

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

はじめに

HappinessChainのインプット課題として、『プロを目指す人のためのRuby入門』を読んだので、簡単に感想を書きます。

読み方

事前に著者が公開している動画を視聴して参考にした。

youtu.be

11日間かけて、1日1時間〜5時間程度かけて読んだ。

コードは基本的に読んで理解し、例題と、重要な箇所で理解しづらいところだけは手で写したり自分でアレンジしたりした。

良かったところ

コード例が豊富でわかりやすい

新たな概念の説明ごとにコードがあり、わかりやすかった。

GitHubでサンプルコードも公開されているので、ちょっと動かしたい時や自分で写経してうまく動かなかった時に便利。

既存の内容を扱った箇所を教えてくれる

すでに前の章で説明した内容について、どこで扱ったかを必ず書いてくれているのがありがたい。

「あれ?これ前に出てきたけどなんだったっけ...」となりがちだが、そういう時に必ず「これこれについては7.10.5を読み返してください」「5.6.5を参照」のように、扱った箇所を書いてくれている。わからない時は一旦そこに戻って読み返すことができたので、復習しやすかった。

ハイレベルな内容も扱っている

タイトルに"プロを目指す人のための"とあるように、Ruby初心者から上級者向けの内容も扱っているので、本格的にRubyの開発を進めた後にまた読み返しても、まだまだ新たに学ぶことがありそう。

難しかったところ

全体的に、他の言語に全く触れたことがない人にとっては難しめな本だと感じた。私は一応他言語での開発経験があり、オブジェクト指向言語JavaPythonに触れた*1ことがあるので、ある程度はついていくことができた。

上述の動画で著者が言及しているように、7章以降は難しかった。
特にモジュールとProcはまだ理解が浅く、章の後半は軽く目を通した程度になっている。今後必要な時に適宜読み返したい。

学んだこと

ここからは、各章で学んだことを簡単に記載する。

第1章 本書を読み進める前に

本の概要、Rubyの動かし方、Rubyの公式リファレンスについて学んだ。
公式リファレンスについては、この本の著者が書いている以下のZennの本も参考になった。

zenn.dev

第2章 Rubyの基礎を理解する

数値、文字列、型、メソッドについて学んだ。
Rubyは標準出力だけでputs, print, p, ppと4種類もあって、それらの違いの話が興味深かった。

コード解析ツールRuboCopについて簡単に紹介されていた。今後のアウトプット課題で必要なので導入した。
余談だが、以下のQiita記事を参考にしてフォーマットもRubocopにしてもらえるように設定したり、拡張機能の「endwise」を入れて自動でendが補完されるようにした。

qiita.com

第3章 テストを自動化する

今後作成するプログラムの動作確認のために、Minitestというフレームワークを使ってRubyのテストを自動化する方法について学んだ。

第4章 配列や繰り返し処理を理解する

配列、ブロック、繰り返し処理について学んだ

この章の例題で初めてテスト駆動開発に触れられてとても楽しかった!
実装するよりまずテストコードを書いて、テストがちゃんと失敗することを確かめるという手順を踏むのが新鮮だった。

第5章 ハッシュやシンボルを理解する

ハッシュとシンボルについて学んだ。

ProgateでRubyRailsをやっていて、:name: nameと書いたりname:と書いたりよくミスっていたのだが、シンボルというものであり、文字列とは違うことをようやく理解できた。

第6章 正規表現を理解する

Rubyでの正規表現オブジェクトについて学んだ。

この章で紹介されていた、この本の著者が書いた正規表現についてのQiita記事のシリーズはものすごく勉強になった
今まで仕事で正規表現が出てくるたびにググったサンプルを四苦八苦して組み合わせていたのだが、今回時間をかけて手を動かしてこのシリーズを読んだおかげで、自分できちんと考えて正規表現を書けるようになった。

qiita.com

第7章 クラスの作成を理解する

Rubyでのオブジェクト指向について学んだ。

例題の改札機プログラムでオブジェクト指向の便利さを実感した。独力でこのようなコードをまだ書けないので、今後アウトプット課題で鍛えたい。

書かれた場所によってselfキーワードが指すものが変わるのだが、その辺りが理解しきれなかった。

第8章 モジュールを理解する

モジュールについて学んだ。

Rubyは多重継承はできないが、モジュールをクラスにincludeして機能を追加する(ミックスインする)ことで多重継承っぽいことはできる。

公式リファレンスでよく見かけるEnumerableや比較の時によく使用する<=>についても理解できた。

第9章 例外処理を理解する

Rubyでの例外の捕捉方法について学んだ。

紹介されていた例外処理のベストプラクティスの考え方は多言語でも活かせそうだった。
たとえば、例外処理部分自体をテストしておくこととか。いざ例外処理が発生した時にうまく処理できなかったら、例外処理を書いておいた意味がなくなってしまう。

第10章 yieldとProcを理解する

yieldとProcについて学んだ。

ブロック(手続きのまとまり)を引数としてメソッドに渡したり、Procクラスを使ってブロックをオブジェクト化したりした。

私はJavaScriptのコールバック関数もまだあまり使いこなせていないので、どうも「処理のかたまりをオブジェクトとして扱う」みたいなことが苦手なようだ。

第11章 パターンマッチを理解する

Ruby3.0で新しく導入されたパターンマッチについて学んだ。
第8〜10章までがだいぶ難しかったので身構えていたのだが、あまり苦労せず理解できた。

第12章 Rubyデバッグ技法を身につける

Rubyでのデバッグ方法や汎用的なトラブルシューティングについて学んだ。

第13章 Rubyに関するその他のトピック

付録のような感じで、本編に出てこなかった色々なトピックに触れた。

*1:アウトプット不足なので本当に"触れた"程度