nilが結果として帰ってきた場合、その要素は最初から含めないようにするmapのようなメソッド


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

[code]

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

あるいは:

[code]

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

といったように。

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

[code]

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

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




`map` は一対一対応の写像なので、その中で要素数を減らすのは難しいと思います。

[code]

    [3, 5, 9].map { |x| x * x if x % 3 == 0 }.compact # 写像して nil 削除
    
    [3, 5, 9].inject([]) { |ary, x| ary << x * x if x % 3 == 0; ary } # 畳み込み
    
[/code]

とかいかがでしょう（他にもあるでしょうけど）。

