2

カスタムメソッドを構築したいと思いますArray#drop_every(n)(モンキーパッチであることはわかっています。宿題のためにこれを行っています)。これは、n番目の要素ごとに省略された新しい配列を返します。

[4, 8, 15, 16, 23, 42].drop_every(2) # [4, 15, 23]

で実装したいのですArray#delete_ifが、要素自体ではなくインデックスを参照することで、( と同様にeach_index)次のようになります。

def drop_every(step)
  self.delete_if { |index| index % step == 0 }
end

どうすればいいですか?私は を使用することを主張しません。私はとdelete_ifも見ました。他の提案は大歓迎です。drop_whilereject

4

6 に答える 6

3

with_index列挙子を返すメソッドを使用し、コレクションをフィルタリングしてから、インデックスを削除できます。

class Array
  def drop_every(step)
    self.each.with_index.select { |_, index| index % step == 0 }.map(&:first)
  end
end

[4, 8, 15, 16, 23, 42].drop_every(2) # => [4, 15, 23]
于 2013-10-11T12:12:25.383 に答える
1
class Array
  def drop_every(step)
    self.each_slice(step).flat_map{|slice| slice[0..-2]}
  end
end

p [4, 8, 15, 16, 23, 42].drop_every(2) #=> [4, 15, 23]
于 2013-10-11T14:04:53.420 に答える
1

Enumerable代わりに mixin を拡張します。

module Enumerable
  def drop_every(step)
    return to_enum(:drop_every, step) unless block_given?
    each.with_index(1) do |o, i|
      yield o unless i % step == 0
    end
  end
end

(1..10).drop_every(3) { |a| p a }
# outputs below
1
2
4
5
7
8
10
于 2013-10-14T08:44:15.153 に答える