配列の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の判定について調べました。そしたらありましたよ。リファレンスに。

Ruby では false または nil だけが偽で、それ以外は 0 や空文字列も含め全て真です。

おお!これだ!ってことでコードは次のようになりました。

なんか配列.count{|x| なんかハッシュ[x]}

すごい。シンプルすぎる。すごいよRuby
ArrayとEnumerableのメソッドは全て一度は使ってみたほうがいいですね!


ライフゲームのコードはこちら