3

私はこのような配列を持っています:

stuff = ["A", " ", "C", " ", "E", " ", "G"]

そして、データが空白であるすべてのインデックスの配列を返したいと思います。例えば:

[1, 3, 5]

これを行うための優れた機能的な方法はありますか?each_with_indexを返すメソッドがあることは知っていEnumerableますが、フィルターを使用してそれを使用する方法がわかりませんでした。

編集:NVM、30分の試行の後にそれを解決しただけです。これが私の方法です。

indexes = stuff.collect.with_index { |elem, index| index if elem == " "}.
             select { |elem| not elem.nil? }
4

3 に答える 3

4

少し短くしましょう。

['A', ' ', 'C', ' ', 'E', ' ', 'G'].map.with_index { |e, i| i if e == ' ' }.compact

Enumerable#compact重要なのは、を実行する代わりに使用できるということですselect#mapまた、特に関数型プログラミングについて話すときは、より一般的な用語であることがわかりますが、それは最終的にはリンゴとオレンジです。

于 2012-07-16T08:33:38.327 に答える
1

複数の場所で使用する場合、このメソッドで Array クラスを拡張します

class Array
  def index_all( val = nil )
    ary = []
    each_with_index { |x, i|
      ary.push(i) if x == val or block_given? && yield(x)
    }
    ary
  end
end

['A', ' ', 'C', ' ', 'E', ' ', 'G'].index_all(" ") #=> [1, 3, 5]
于 2012-07-16T11:07:36.187 に答える