Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、 a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、 b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する という動作をするコードとして、`fetch`を使う以下のようなコードサンプルが提示されている。 ```ruby hash[key] = hash.fetch(key, []) << value ``` このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。 ```ruby 10.times.reduce({}) do |hash, value| key = value.odd? ? :odd : :even hash[key] = hash.fetch(key, []) << value hash end => {:even=>[0, 2, 4, 6, 8], :odd=>[1, 3, 5, 7, 9]} ``` さて、この`hash[key] = hash.fetch(key, []) << value`と同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。 ```ruby (hash[key] ||= []) << value ``` こちらのコードの方が、`key`が2回登場しないという面で[DRY原則](https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself)的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。 なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。 ```ruby ary = (hash[key] ||= []) ary << value ```