2013-12-17 8 views
11

Sto provando a scrivere un clone del rubino keep_if e i metodi dell'array delete_if. Ecco il mio codice.Il blocco pass passato al metodo in un altro metodo in 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 

Questo funziona. Ma io voglio fare qualcosa di simile: il comportamento

def discard 
    self - self.keep &block 
end 

desiderata:

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

Così ho bisogno di passare il blocco che viene passato al metodo discard, da trasmettere al metodo keep. Come ottengo questo?

risposta

23

è possibile fare riferimento in modo esplicito il blocco

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

o implicitamente

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

Nel tuo caso, vorrei suggerire il primo approccio.

+0

Grazie! Ho finito per risolverlo senza passare il blocco, ma ho comunque imparato qualcosa. – Kappie001

+0

Sono sorpreso che sia necessaria tutta questa risposta. Sembrava che una soluzione più complicata fosse desiderata. Proverò a formulare e chiedere il modo originale in cui ho letto la domanda –

Problemi correlati