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

我很惊讶,这是所有需要的答案。听起来像是想要一个更复杂的解决方案。我会试着制定和问我原来阅读这个问题的方式 –