例えば、ある配列で、その要素が3の倍数のときのみ、その要素を掛け合わせた配列を新たに作りたいとします。具体的には[3, 5, 9]という配列が与えられた場合、期待している結果の配列が[9, 81]であるとします。このような判定を実現するためには、下のようなコードで出来ます:

[3, 5, 9].map { |x| x * x if x % 3 == 0 }.select { |x| !!x }

あるいは:

[3, 5, 9].select { |x| x % 3 == 0 }.map { |x| x * x }

といったように。

確かに上のように書くことは可能なのですが、個人的には、mapの中で、帰ってくる結果がnilであるならば、それを配列の要素に含みたくないことを、selectを使わずに表現したいと思っています。想定しているのは、以下の使い方に近い書き方です:

[3, 5, 9].map { |x| x * x if x % 3 == 0 }

もちろん、このままだとnilの要素も含まれてしまうので、上のような希望を達成することが出来ません。上記のような希望を実現できるメソッド、あるいは方法がもしあれば教えてください。