2013-12-17 189 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 

This works。但我想要做的事,如:

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

我很驚訝,這是所有需要的答案。聽起來像是想要一個更復雜的解決方案。我會試着制定和問我原來閱讀這個問題的方式 –