Effective Ruby第1章まとめ
この記事について
Effective Rubyの第1章を読んだので、重要だと思ったところをまとめます。
オブジェクトがnilかもしれない可能性を考える
Rubyは型システムの構造上全てのオブジェクトがnilになりうるので、nilにメソッド呼び出ししたりメソッドの引数にnilを渡すことになっても予期しない動作が起こってしまわないように気をつける必要があります。
nilをうまくハンドリングしてくれるメソッド
- Array#compact(Hash#compact)
レシーバがイテレータの場合、その要素からnilを取り除いて新しいオブジェクトを返します。(レシーバがHashの場合はvalueがnilの要素を取り除くます) また、compact!でレシーバを破壊的に変更します。
# Array a = [1, nil, 3] a.compact #=> [1, 3] a #=> [1, nil, 3] a.compact! #=> [1, 3] a #=> [1, 3] # Hash h = {a: 1, b: nil, c: 3} h.compact #=> {a: 1, c: 3} h #=> {a: 1, b: nil, c: 3} h.compact! #=> {a: 1, c: 3} h #=> {a: 1, c: 3}
- NilClass#nil?
レシーバがNilClassのインスタンス(すなわちnil)の時だけtrueを返し、それ以外の場合はfalseを返します。
定数がミュータブルなことに気をつける
書き換えられないようにするためにはfreeze
を使います
- 定数が配列やハッシュなどのコレクションオブジェクトを参照する場合は、コレクションとその要素もフリーズする
PIYO = ['a', 'b', 'c'] PIYO.map!(&:freeze).freeze
- 凍結されるのはオブジェクトであり、変数ではない
hoge = 'huga'.freeze hoge = 'piyo' puts hoge #=> piyo
まとめ
nilをうまくハンドリングしてくれるメソッドたくさんあると思うのですが、全然調べられなかったのでいつかリベンジしたいです。 Effective Rubyはtips集の色が強いので、箇条書きの丸写しになってしまわないように自分で検証したり別リソースから調べた情報を盛り込んでいきたいと思います。