はじめに
今回はRubyの定番参考書、
プロを目指す人のためのRuby入門(通称チェリー本) を読了したのでその感想を書かせていただきます。
よかったところ
現場目線の実践的知識を網羅的に学べる
著者の伊藤さんは、今もバリバリのrailsエンジニアで、自身の現場での経験から
「あの時、こんな風に説明してくれたらよかったのに、、、!」
「このテクニックはもっと早く知っておきたかった、、!」
と感じたポイントを盛り込んでこの本を執筆されたそうです。
本書では、現場で通用する実践的な知識・ノウハウが至る所に散りばめられており、
特に12章の「デバック技法」に関しては、誰しもが直面するエラーへの対処法がより具体的に書かれており
現場でエラーに直面した際に是非とも読み返したい項目となっています。
それ以外にも、columnなどで実際の開発では、どのようなコードの書き方をするかなどが書かれており、開発現場でも手元に置いておき、問題に直面したときに都度、読み返したいと感じました。
例題で手を動かしながら学べる
各章には例題が設けられており、インプットした内容を実際に手を動かしてアウトプットすることで、知識の定着化、整理をし、より実践的な知識・ノウハウへと昇華させていくことができます。
インプットが終わった後で、まずは何も見ないで自分で仮説を立てながら解いてみて、そのあとで解説と自分の書いたコードを見比べることで、知識定着と、自分の頭で考える力を身につけることができます。
学んだこと
2章:Rubyの基礎を理解する
- メソッドを呼び出す際は
オブジェクト.メソッド(引数) - 変数名はスネークケース( 例:exmaple_test)で書くのが一般的
- 式展開を使う場合は
#{}を用いる。こうすることで、変数の値や式の結果を文字列の中に埋め込むことができる。 - メソッドを使用する際に、Rubyでは
returnを使用しない書き方を使う方が主流 - Rubyの場合case文を用いる際にJSと異なり、breakを記述する必要はない
- ?を使用するメソッド真偽値を返す。(例:
''.empty? #=> true) - ライブラリは標準ライブラリとその中でも利用頻度が高いものは組み込みライブラリと呼ばれている。また外部のライブラリとしてgemと呼ばれるライブラリもある。
- 組み込みライブラリでない標準ライブラリは、
require ライブラリ名という形で、ライブラリ名を読み込む必要がある。 - 自分で作成した独自のクラス定義を読込む場合は、
require_relativeを使用する。
3章:テストを自動化する
- テストを自動化するためにはテスト用のフレームワークを利用する(Minitest)
- Minitestクラスのメソッドは
test_で始まるメソッドを探して実行するのでメソッド名はtest_が必須。 - 検証メソッドは複数あり、全て覚える必要はなく都度検索する形(例:
assert_equal期待するテスト結果、テスト対象となる式や値) - テストコードは別ファイルに分け、
require_relativeでテストを行うファイルを参照する。
4章:配列や繰り返し処理を理解する
-
配列は複数のデータをまとめて格納できるオブジェクトのこと
-
.lengthで配列の要素の個数を取得することができる。 -
<<で配列の最後に要素を追加。 -
Rubyの繰り返し処理には
for文ではなくeachメソッド+ブロック要素が用いられる。-
eachで配列から要素を1つずつ抜き出して、ブロックで抜き出した要素に何らかの処理を実行する。 - Rubyでは
「要件を問わず共通する処理」はメソッド自身に、「要件によって異なる処理」はブロックに分担させて処理を行う。
-
-
ブロックを用いたメソッド
-
mapメソッド:要素から取り出した値をブロックで処理し、処理済みの新しい要素を配列として返す。 -
selectメソッド:取り出した要素に対してブロックで真偽を評価し、戻り値が真の要素のみを配列として返す。 -
findメソッド:ブロックの戻り値が真になった最初の要素を1つ返す。 -
joinメソッド:配列を連結して1つの文字列にする。
-
-
範囲オブジェクト
- 値の範囲は
..または...を使って作成する。最初の値..最後の値(最後の値を含む)/最初の値...最後の値(最後の値を含まない)
- 値の範囲は
-
その他
-
%記法による配列を作成することで、シングルクォートたダブルクォートが必要ないシンプルな記法で配列を作成することができる。 -
Array.new(要素数,要素名)にて、デフォルト値を設定した配列作成することが可能 -
_with_index:抜き出した要素に要素番号をつけて表示する
-
5章:ハッシュやシンボルを理解する
- ハッシュとは
- ハッシュはキーとバリューを組み合わせてデータ管理するオブジェクトのこと(連想配列とも呼ばれる)
-
ハッシュ[キー] = 値(バリュー):後から値を追加することができる。 -
ハッシュ[キー]:格納されている値を取り出す。
- シンボルとは
- シンボルは任意の文字列と一対一に対応するオブジェクトのこと。
-
:シンボルの名前という形で名前を定義する。 - シンボルは
整数として扱わるので、PCは高速に値を比較することができる。→ハッシュのキーとしてシンボルを使用すると文字列よりも高速で取り出すことができる。 - 同じシンボルは同じオブジェクトなので、メモリの使用率が良い。
- メソッドの引数に
キーワード引数を用いると可読性が上がる。
6章:正規表現を理解する。
- 正規表現:パターンを指定して、文字列を効率よく検索/置換するためのミニ言語
-
\d:半角数字1文字を表す -
{n,m}: 直前の文字がn文字以上、m文字以下,{n}:直前の文字がちょうどn文字 -
?:直前の文字が1または無し -
.:任意の1文字 -
+:直前の文字が1文字以上 -
*:直前の文字が0文字以上 -
():グループ化、キャプチャ -
\w:半角英数字とアンダースコア - rubyの正規表現:
/正規表現/ - キャプチャ
()には(?<name>)という形で名前をつけることができ、呼び出しもこの名前で可能
7章:クラスの作成を理解する
- クラスをもとに作られたデータの塊を
オブジェクトまたはインスタンスと呼ぶ。 - 上記オブジェクトが持つ「動作、振る舞い」を
メソッドと呼ぶ -
属性:オブジェクトから取得できる(設定できる)値のこと - クラス内では
@で始まるインスタンス変数を使うことができる。 -
attr_accecerを使うとクラスの外部からインスタンス変数を呼び出すことが可能 - 上記、読み取り専用にする場合:
attr_reader,書き込み専用にする場合:attr_writer -
setupメソッドMinitestが実行されるたびに自動的に呼び出されるMinitest版のinitializeメソッドのようなもの -
selfを使用することで、クラス内でインスタンス変数を使用 or 再代入することが可能になる + インスタンス変数であることがわかりやすくなる。 -
class サブクラス < スーパークラスにてサブクラスはスーパークラスの属性継承することが可能になる。 -
superで親クラスのメソッドを子クラスで呼び出すことができる。 -
publicメソッドクラスの外部から呼び出せるメソッド。Rubyではinitializeメソッド以外はデフォルトでpublicメソッドになる。 -
privateメソッドクラスの外部から参照することができないメソッド。クラス内で一旦selfをレシーバーにすることで呼び出しが可能となる。 -
privateメソッドはサブクラスからは呼び出すことが可能。(子クラスでprivateメソッドごとオーバーライドする) -
クラスメソッドは基本的にprivateクラスに適用させることができない。(class << self か private_class_methodを使用する) -
protectedメソッド:メソッドを定義した自身と、そのサブクラスのインスタンスメソッドから、レシーバー付きで呼び出せる。 -
クラス名::定数名にてクラス内で定義した定数をクラス外から参照することが可能。 - Rubyにおいて、メソッド内にて定数を定義することはできない。
8章:モジュールを理解する
-
モジュールはクラスに似ているが、インスタンスの生成や継承ができないという特徴を持っている。 - 継承を使うのは適切ではないが、共通の機能を実装したいときにモジュールを使用する。
- クラス外で定義したモジュールは
includeするとクラス内で呼び出せるようになる。(ミックスイン) - モジュールにて
名前空間を設定することが可能。 - この項目は全体的に理解が浅いので、後でまた戻ってくる必要あり、、、!
9章:例外処理を理解する
-
例外処理:プログラムが続行できない状態を意図的に発生させること→エラーが起きた場合に原因が特定しやすくなる。 - 例外を捕捉して処理を続行する場合
begin # 例外が起きうる処理 rescue => 例外オブジェクトを処理する変数 / 捕捉したい例外クラス # 例外が発生した場合の処理 end - 例外クラスを定義する時は、継承関係を考慮して、スーパークラスよりもサブクラスを手前に持ってくるようにする。
-
raiseメソッド:意図的に例外を発生させるメソッド - 安易にレスキューを使ってエラーが発生しても処理を続行しない。エラー発生時の処理はフレームワークに任せる。
- 例外処理よりも条件分岐を使用した方が可読性、パフォーマンスが高い場合もある。
- 例外はここぞというとき(エラーの原因を特定したい時)に使う機能で、むやみに使うべきではない。
10章:yieldとProcを理解する
- yield:定義したブロックをメソッド内で呼び出すことができる。(メソッド内でブロックを使うための変数のようなもの)
- ブロックを引数として受け取る場合は下記のように記述
def メソッド(&引数)
引数.call
end
-
Proc:ブロックをオブジェクト化するためのクラスのこと
11章:パターンマッチを理解する
-
パターンマッチ:case文によく似た、ver3.0から本格的に導入された新しい構文。 - パターンマッチ基本構文
case 式
in パターン1
パターン1にマッチした時の処理
in パターン2
パターン1にマッチせず、パターン2にマッチ
in パターン3
パターン1,2にマッチせず、パターン3にマッチ
end
12章:Rubyのデバック技法を身につける
-
エラーを解消するには
バックトレースに表示される英語のエラー文を臆することなく読み解けるようになること。 -
バックトレース:プログラムが実行されてエラーが発生するまでのメソッド呼び出し履歴を示した情報。上に行くほどエラーに近い。 -
英語が苦手な人は辞書を引きながらでもいいのでエラー文を読み解いていくこと。
-
定型エラー文
-
NameError:未定義のローカル変数や定数などを呼び出したときに発生。(要因:タイプミス、外部ファイル、ライブラリの参照ミス) -
NoMethodError:呼び出せないメソッドを呼び出そうとした場合に発生する。下記要因↓- タイプミス
- privateメソッドをクラスの外部から呼び出した
- レシーバーの型(クラス)が想定していた型と異なる。
- レシーバーが想定に反してnilになっている。
-
SyntaxError:構文エラー(要因: endやカンマの数に過不足がある、丸カッコや中カッコが閉じられていない)
-
-
デバック
-
printデバッグ:printメソッドをプログラムに埋め込んで、プログラムを実行し、ターミナルに出力される値を確認して不具合の原因を探る。 -
debug.gem:プログラムを1行ずつ実行しながら変数の中身を確認したり、実行される条件分岐を確認したりすることができる。
-
-
トラブルシューティング
- irb上で簡単なコードを動かす
- ログを調べる
- 公式ドキュメント、リファレンスを読む:一次情報なので、網羅性や信憑性が高い
- issueを検索する
- ライブラリのコードを読む
- テストコードを書く
- ググる(警戒しながら)
- パソコンの前から離れる
- 誰かに聞く
13章:Rubyに関するその他トピック
- gemとBundler
- Rubyのライブラリはgemという形式でパッケージングされ、gemコマンドを使用してダウンロードする。
-
Bundler:1つのコマンドで大量のgemをどの環境でも統一のverでインストールすることができる。(大規模なrailsアプリでは大量のgemが必要) - 使いたい gemが増えたら、
Gemfileに記述しbundle install -
Gemfile.lock:Bundlerで管理すべきgemとそのバージョン番号が記載されている。
難しかったところ
プログミングの基礎部分は分かっている前提で書かれている
入門書と書かれていますが、プログラミングの基礎部分は分かっている前提で書かれているので
プログラミング完全初学者には読み進めるのが難しい内容となっています。
以下の用語がピンとこない人は一度Progateなどでプログラミングの基礎を学んでから読み進めることをお勧めします。
- 変数
- 配列
- 関数・メソッド
- 引数
- 戻り値
- 条件分岐(if文)
- 繰り返し
- クラス
- オブジェクト
私の場合はクラス,オブジェクト に関する理解が浅かったので、7章、8章が読み進めるのに時間がかかり、改めてオブジェクト指向について学ぶ必要性を認識することができました。
難しい箇所の読み方
本書にも書かれていますが、「わからない箇所はインデックスを作ってサラッと読む」 ことをお勧めします。
このインデックスを作るというのは、実際の開発でわからない箇所が出てきたときに、後から「あー、そういえばこんな内容チェリー本に書いたあったなあ」と思い出して、読み返せる程度にしておくということです。
本書は 「現場で使えるruby知識」 を中心に書かれているので、ruby,railsを用いた実務経験がない人にとってはピンとこない場所が多々あります。
実際に私も、開発経験が少ないので、7章以降に関しては50%も理解できてないと思います。
ただ、今の段階で全て覚える必要はなく、実際に手を動かしてコードを書いてみて、理解できない箇所が出たら都度このチェリー本に立ち返るというスタンスで問題ないと思います。
インプット→アウトプット→分からない→該当箇所インプット→アウトプット、、、、
を繰り返していくことではじめて、知ってるだけの知識を、実践的知識に昇華させていくことができるようになります。
下記、著者本人の伊藤さんが読み進め方を解説してくれているので参考までにご確認ください。
終わりに
今回はプロを目指す人のためのRuby入門(通称チェリー本) に関する感想記事を書かせていただきました。
チェリー本は難易度が高く、一度に全てを理解するのは難しいですが、アウトプットをする中で、都度立ち返ることで、徐々に実践的知識へと昇華させていければと思います。