以前から気になっていた "Effective Ruby" を読んだ。 Effective シリーズは中級〜上級向けプログラマーの読むべき本として親しまれている。
個人的にもっとも得意な言語はRubyだったので、このシリーズが出るのを楽しみにしていた("得意な"と変換しようとしたら"特異な"と変換されるくらいには使用している)。
中身のネタバレはもったいないので、この本を通じて自分が今まで見落としていた点を挙げてみようと思う。
nil 時の対応
array = hoge() array.split('/')[1]
NoMethodError: undefined method hoge for nil:NilClass
。Rubyプログラマーなら何度も遭遇するであろうこのエラー。配列でnilっぽくしたい時は空の配列を用意してあげたいところだが、その変数にnilが返ってきてしまうとこの問題に出くわしてしまう。
例えばある変数があって、それに array.split('/')
とさせるとしよう。ここでarray変数がnilなのか、そもそも配列なのか、よくわからない。ちゃんとコードを戻って読まないといけない。
この問題を解決する素晴らしい手段が本書には書かれている。一体何でしょう?
なんでもかんでもHash使いたい
@hash = {} @hash[:hoge] = hoge @hash[:fuga] = fuga ...
これはまさしく自分だった。Hashを使えばコードを簡潔に書くことができる。特にRailsアプリなどではViewに渡すインスタンス変数をHashに変換し、View側でそのHashを取得するような処理を書くことは多いのではないだろうか。
しかし、Hashはなんでもかんでもキーとして詰め込むことができるため、このキーが一体どの部分で入れられたものなのか、コードを読み直す必要が出てくる。また、存在しないキーが出てきてもnilを返すだけで、例外を投げないため間違っているかどうかの判断がつかない。
ではどうするのがEffectiveなのか。一体何でしょう?
reduce をマスターせよ
本書で唯一 特定のメソッドに対して複数ページを割いて解説しているメソッドがある。それが reduce
だ。これをわかりやすいサンプルとともに、ただ合計値を出すだけでない他のreduceの使い方を示してくれている。これにより、今まで無駄に書いていたあの処理が実はreduceで書き換えられるということを理解できるだろう。
終わりに
ある程度Rubyに慣れ親しんだ方なら、 何かしらのGemを入れ、気になった時はそのGemのソースコードを読む機会が何度かあったと思う。基本的にはそこから学ぶことが大変多いのだけども、この本はそれらの知識・ノウハウをよくまとめられているという印象を受けた。
対象としてはパーフェクトRubyとか読んだ後なら普通に読めると思うけど、Effective Ruby の場合はそれなりにRubyコードを実際に書いて運用した経験をした後によむと、「あ、こういう書き方ができるのか!」という発見があって楽しく読めると思う。