2013-12-17 9 views
11

Ich versuche, einen Klon der Ruby keep_if und delete_if Array-Methoden zu schreiben. Hier ist mein Code.Pass-Block an Methode zu einer anderen Methode in Ruby übergeben

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 

Dies funktioniert. Aber ich will, wie etwas tun:

def discard 
    self - self.keep &block 
end 

Wunschverhalten:

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

Also muß ich um den Block zu übergeben, die an die discard Methode übergeben wird, auf die keep Methode übergeben werden. Wie erreiche ich das?

Antwort

23

können Sie den Block

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

oder implizit

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

In Ihrem Fall würde ich vorschlagen, den ersten Ansatz ausdrücklich verweisen.

+0

Danke! Ich habe es gelöst, ohne den Block zu passieren, aber ich habe trotzdem etwas gelernt. – Kappie001

+0

Ich bin überrascht, dass all diese Antwort benötigt wird. Es klang wie eine kompliziertere Lösung gewünscht wurde. Ich werde versuchen, die ursprüngliche Art zu formulieren und zu fragen, wie ich die Frage lese –