Effective Ruby第1章まとめ

この記事について

Effective Rubyの第1章を読んだので、重要だと思ったところをまとめます。

オブジェクトがnilかもしれない可能性を考える

Rubyは型システムの構造上全てのオブジェクトがnilになりうるので、nilにメソッド呼び出ししたりメソッドの引数にnilを渡すことになっても予期しない動作が起こってしまわないように気をつける必要があります。

nilをうまくハンドリングしてくれるメソッド
  • Array#compact(Hash#compact)

レシーバがイテレータの場合、その要素からnilを取り除いて新しいオブジェクトを返します。(レシーバがHashの場合はvaluenilの要素を取り除くます) また、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集の色が強いので、箇条書きの丸写しになってしまわないように自分で検証したり別リソースから調べた情報を盛り込んでいきたいと思います。