Rubyのメソッドに渡されたブロックを別のメソッドに渡す

概要

Ruby の keep_if および delete_if 配列メソッドのクローンを作成しようとしています。これが私のコードです。

module Strain
  def keep
    self.inject([]) do |extracts, element|
      yield(element) ? extracts << element : extracts 
    end
  end

  def discard
    self.inject([]) do |extracts, element|
      !yield(element) ? extracts << element : extracts
    end
  end
end

class Array
  include Strain
end

これは機能します。しかし、私は次のようなことをしたいです:

def discard
  self - self.keep &block
end

望ましい動作:

[1, 2, 3].discard { |number| number < 2 }
# => [2, 3]

したがって、discard メソッドに渡されたブロックを keep メソッドに渡す必要があります。どうすればこれを達成できますか?

解決策

ブロックを明示的に参照できます

def discard(&block)
  self - self.keep(&block)
end

または暗黙的に

def discard
  self - self.keep(&Proc.new {})
end

あなたの場合、最初のアプローチをお勧めします。