チェリー本の読書メモ

[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)を読みました。[スッキリわかるJava入門](https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1%E6%B8%85%E5%96%AC/dp/4295007803/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=5MW4K5WCCYJX&keywords=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8Bjava%E5%85%A5%E9%96%80&qid=1580187825&s=books&sprefix=%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%2Cstripbooks%2C262&sr=1-1)以来の大当たり本でした。
Rubyに対する理解がかなり深まりました。@jnchito さんありがとうございます！

誰かの役に立つかは微妙ですが、読書メモを公開します。

##2章（Rubyの基本）
・if文からも戻り値が取得できる

```rb
a = 
  if true
    '真です'
  else
    '偽です'
  end
a #=> 真です
```

・標準ライブラリの中にも、デフォルトで組み込まれていないものがある。
→ require 'csv'とか書いていたのはそういうことだったのか

・自分で作成したプログラム(別ファイル)を読み込む時は
`require './sample'`とか`load './sample.rb'`とかでいける。

##4章（配列、繰り返し）
・配列の最後に値を追加する時は`array << value`が使える（`array.push(value)`でも可)

・ブロックの式が1行の場合は`do..end`ではなく`{}`を使うと良い

・空の配列を用意して、戻り値をそのまま新しい変数に入れる処理は`each`ではなく`map`を使うと良い

```rb
numbers = [1,2,3,4,5]
new_numbers = numbers.map { |n| n * 10 }
new_numbers #=>[10, 20, 30, 40 ,50]
```

・配列の中身を検証し、真である値だけを集める時は`select(reject)`が使える

・インプットとアウトプットが明確で、テストコードの書き方が最初からイメージできる場合は、先にテストから書くと良い

・テストを先に書く場合、テストを書いた直後に、まずなんのロジックも持たず値だけ返すメソッドを作って疎通確認をする→テストを追加して、全てパスするようにコードを実行する(三角測量と言う)

・引数があるメソッドの場合`()`を省略しない方が不具合が減りそう

・配列には豊富なAPIが用意されているので、うまく使えばコードを簡略化することができる

##5章(ハッシュとシンボル）
・シンボルは文字列っぽい見た目の数字。イミュータブル(変更不可)で、処理効率が良い。よくハッシュのキーに使われる。

・シンボルがハッシュのキーになる場合`key: 'value'` = `:key => 'value`

・最後の引数がハッシュであれば、ハッシュリテラル`{}`は省略できる

```rb
def buy_burger(menu, options = {})
  hogehoge
end
# 以下の2つは同じ意味
buy_burger(fish, { drink: true, potato: false })
buy_burger(fish, drink: true, potato: false)
```

・シンボルの配列を作る時には`%i()`を使う

```rb
%i(apple orange melon) #=>[:apple, :orange, :melon]
```

・変数の中身がnilじゃない時にだけメソッドを実行したい場合には`variable&.method`が使える(ぼっち演算子）

・変数の中身がnilまたはfalseの時だけ代入する場合には`variable ||= 10`が使える

・trueかfalseだけを返したい場合`!!valuable`が使える

##6章（正規表現）
・`scan`：引数で渡した正規表現にマッチする部分を配列で返す

・`[], slice`：正規表現にマッチした部分を抜き出す。複数ある場合には最初にマッチした部分を返す。キャプチャを使うと、引数で何番目かを指定することもできる。

・`split`：マッチした文字列を区切り文字にして文字列を分解し、配列を返す。カンマ区切りの文字列を配列に分解する時などに使う。

・`gsub`：第一引数の正規表現にマッチした文字列を、第二引数の文字列で置き換える。

・正規表現の中で`()`を使ってキャプチャすると置換の時とかにその部分を再利用できる

##7章（クラスの作成）
・クラスを使うと、（ハッシュの場合と違い）タイプミスをした時にエラーが発生したり、入力する値を制限することができる

・Rubyでは、メソッドのことを関数と呼ぶことはほとんどない

・privateメソッドは、レシーバーを指定して呼び出すことができない

・定数をメソッドの内部で定義することはできない。必ずクラスの直下で定義する。

##8章（モジュール）
・継承ができる関係性(is-a)になりクラス間で、共通の処理を行いたい時に使う(ミックスイン、1つ目の使い方）

・モジュールはクラスと似ているけど
モジュールからインスタンスを作成することはできず
他のモジュールやクラスを継承することはできない

・モジュールは名前空間としても使われる（2つ目の使い方）
名前空間が違えば、同じクラス名を複数箇所で使っても問題にならない。カテゴリ分けにも役立つ。
ネストさせる方法と、`Admin::User`のように`::`を使う書き方がある。

・関数置き場のような使い方もできる(3つ目の使い方）

・状態（定数、変数など）を保持するためにも使われることがある（4つ目の使い方）

##9章（例外処理）
・例外が発生すると、そこでプログラムが止まる

・例外が発生しても、rescueしないことの方が多い。Railsでは例外発生時の処理があらかじめ組み込まれている。例外はむやみに使わず「ここぞ」という時にだけ使う。（メール送信やcase文など）

・100人にメールを送信するような処理では、途中で送信失敗してもrescueして最後まで送信を続ける必要がある。その場合、**例外のクラス名**、**エラーメッセージ**、**バックトレース**の3つをログに書き込む

・beginの中に処理がたくさんあると、例外を捉えても原因が特定しずらい
→beginの中はなるべく薄くするべき

・`case文`や`if/elsif`で、予期しない値が入ってきた場合に例外を投げるようにすると、エラーの箇所が特定できて良い。（予期しない値のまま処理が続行してしまうと、いずれどこかでエラーが発生する。）

##10章（yeildとProc）
・メソッドの引数にブロック(処理のかたまり)を渡して、柔軟なプログラミングを行うための仕組みらしい。あんまりちゃんと理解できなかった。おいおいわかるようになればいいや。

##11章（デバッグ技法）
・エラーメッセージ、公式のドキュメントなど、英語をちゃんと読んでいくこと

・デバッグ技法は色々紹介されていたけど、Railsの場合は`better_errors`と`binding_of_caller`を使って、任意の場所でエラーを発生させて値などを確認するやり方が一番良いと思った。

・手作業で再現させるのが面倒なエラーは、エラーが発生した後でもテストコードを書いて検証した方が楽。

・再現が面倒でなくても、エラーが発生した箇所は再発防止のためにテストコードを書いておいた方が良い。

・ネットの情報を理解せずに採用すると、余計に事態を悪化させることに繋がるので注意。

##12章（Rubyに関するその他のトピック）
・時間に関する標準ライブラリは3種類あるが、組み込みライブラリである`Time`を使うのが無難。

・brakemanというコードのセキュリティをチェックしてくれるツールがある

・ruby criticというコードの品質をチェックしてくれるツールがある

・DSL(ドメイン固有言語)は、「特定の目的に特化した、人間にも機械にも優しい言語」

・Rubyは柔軟な書き方ができるから、DSLとの相性が良い

・Bundlerは、gemの依存関係を管理したり、1つのPCに同じgemの複数のバージョンがある時、プログラム実行時に適切なバージョンに切り替えてくれる

・Bundler自体が1つのgem

・Gemfileでgemのバージョンを指定しない場合、問題が起きないバージョンがすでにPCにインストールされていればそれを使い、無い場合は問題が起きない最新バージョンがインストールされる

##13章（Ruby in Rails習得に向けた予備知識）
・Railsには定数の自動読み込みという機能があり、コード中に不明なクラスが登場すると、それっぽいものを勝手に探して`require`してくれる
→`require`を書く回数が少ない

・組み込みでは無い標準ライブラリも、デフォルトで`require`されるものが多い。（`csv`など、例外もある）

・標準クラスにRailsが独自にメソッドを追加、拡張している（`Time.zone.now`、`underscore`）など

・gemが標準クラスを拡張することもある

・gemを使う時は、`最終更新日`、`スター数`、`未解決のissueの数`を確認すると良い