既存クラスの拡張
javaのコードでよくある、空文字かどうかのチェックロジック。
if (str == null || str.equals("")) {
これは次のようにcommonsのStringUtilsを使えばもうちょっとすっきり書ける。
if (StringUtils.isEmpty(str)){
で、rubyはどうかというとStringクラスにempty?というメソッドがあるのでどうやらこれを使うらしい。流石オブジェクト指向が徹底されてますなぁ。StringUtilsという他人に渡してチェックしてもらうんではなくて自分で確認できるんだからね。でも待てよ、それだと上の例でいうところのstr.equals("")だけしかしてないんじゃ。。nilチェックは?ということで実験してみるも予想通り例外が発生してしまった。
str = nil
str.empty?
ただjavaと違ってNullPointerExceptionとはちょっと違う。rubyの世界ではすべてがオブジェクト。rubyのnilはjavaのnullのように得体の知れない特別なものではなく、NilClassのオブジェクトだ。よって単にNilClassにempty?というメソッドが定義されて無いよ、という意味のNoMethodErrorが発生するのだ。
うーむ。NilClassにempty?メソッドがあったらいいのになぁ。。そしたらNullオブジェクトパターンが出来上がるのになぁ。。
実は!そんな時rubyではjavascriptのように組み込みクラスであってもメソッドを追加できるんです!実装は以下。
class NilClass def empty? true end end
これで例外が出ずに毎回trueとなりました♪
str = nil
str.empty?
既存クラスを拡張するのは是か非かはよく分かりませんが、この程度なら個人的には結構いいんじゃないの、と思っています。