2013-12-17 11 views
11

ruby​​ keep_ifdelete_if配列メソッドのクローンを作成しようとしています。ここに私のコードです。ブロックをRubyの別のメソッドに渡す

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メソッドに渡されるに合格する必要がありますが、私のような何かをしたいです。これをどのように達成するのですか?

答えて

23

あなたは、あなたの場合は、明示的に

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

または暗黙

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

ブロックを参照することができ、私は最初のアプローチをお勧めします。

+0

ありがとうございます!私はブロックを通過することなくそれを解決したが、それでもなお何かを学んだ。 – Kappie001

+0

私はこのすべての答えが必要であることに驚いています。もっと複雑な解決が望まれていたように聞こえました。私は公式化しようとし、私は質問を読む元の方法を尋ねる –

関連する問題