Effective Ruby 第3章まとめ

こんにちは!kossyです!




さて、今回はEffective Rubyの第3章の覚えておくべき事項を
ブログにまとめてみたいと思います。

前回までの章をまとめたものはこちら
Effective Ruby 第1章まとめ - その辺にいるWebエンジニアの備忘録
Effective Ruby 第2章まとめ - その辺にいるWebエンジニアの備忘録

第3章 コレクション

3-1. コレクションを書き換える前に引数として渡すコレクションのコピーを作っておこう

  • Rubyのメソッド引数は値渡しではなく参照渡しである。ただし、この規則には、Fixnumオブジェクトという顕著な例外がある
  • 引数として渡されたコレクションは、書き換える前にコピーを作ろう
  • dup、cloneメソッドは、シャローコピーしか作らない
  • ほとんどのオブジェクトでは、Marshalを使えば必要なときにディープコピーを作れる

3-2. nilスカラーオブジェクトを配列に変換するには、Arrayメソッドを使おう

  • nilスカラーオブジェクトを配列に変換するには、Kernel#Arrayメソッドを使う。
  • ArrayメソッドにHashを渡してはならない。Hashは一連のネストされた配列に変換されてしまう。

3-3. 要素が含まれているかどうかの処理を効率よく行うために集合を使うことを検討しよう

  • 要素が含まれているかどうかの高速チェックではSetを使うことを検討しよう
  • Setに挿入されるオブジェクトは、ハッシュキーとしても使えなければならない
  • Setを使う前に、require('set')を実行しよう

3-4. reduceを使ってコレクションを畳み込む方法を身につけよう

  • アキュムレータの初期値は必ず使おう
  • reduceのブロックは、必ずアキュムレータを返すようにする。現在のアキュムレータを書き換えるのは問題ないが、それをブロックから返すのを忘れないようにすることだ。

3-5. ハッシュのデフォルト値を利用することを検討しよう

  • Hashのデフォルト値を使うことを検討しよう
  • ハッシュがキーを含んでいるかどうかをチェックする時には、has_key?またはその別名を使おう。つまり、存在しないキーにアクセスしたらnilが返されることを前提としてコードを書いてはならない
  • デフォルト値を使うよりもHash#fetchを使った方が安全な場合がある

3-6. コレクションクラスからの継承よりも委譲を使うようにしよう

  • コレクションクラスからの継承よりも委譲を使うようにしよう
  • 委譲のターゲットのコピーを作るinitialize_copyメソッドを忘れずに書こう
  • 委譲ターゲットに対応するメッセージを送ってからsuperを呼び出すという形でfreeze、taint、untaintメソッドを書こう


出典: https://www.shoeisha.co.jp/book/detail/9784798139821