配列のnil以外の要素数をカウントする
Conway's Game of Life(ライフゲーム)を実装していて、配列の要素のうちnilでない要素の数をカウントする必要がありました。
Array.map
早速Arrayのリファレンスを眺めてmapメソッドとcompactメソッドを使えば行けそうだぞってことで次のようなコードを書きました。
配列の要素をキーにハッシュから値を取得して、取得できた値の件数をカウントする例です。
なんか配列.map{|x| なんかハッシュ[x]}.compact.size
mapにより生成された配列にはnilが含まれる可能性があるのでcompactでnilを取り除くことを考えました。あまりスマートじゃないけどJavaではこのようには書けないのでとりあえずこれで満足していました。
Enumerable.count
でも後になってArrayのスーパークラスであるEnumerableにcountというメソッドがあることを知りました。なんだこれを使えばもっと簡単に書けるじゃん!てことで次のようなコードを書きました。
なんか配列.count{|x| !なんかハッシュ[x].nil?}
Javaプログラマ的な発想ですよね。いやnilの特性をよくわかっていなかったんです。
ただ、なんかnilの判定が気持ち悪くてRubyならもっとスマートに書けるんじゃない?と思ってnilの判定について調べました。そしたらありましたよ。リファレンスに。
おお!これだ!ってことでコードは次のようになりました。
なんか配列.count{|x| なんかハッシュ[x]}
すごい。シンプルすぎる。すごいよRuby。
ArrayとEnumerableのメソッドは全て一度は使ってみたほうがいいですね!