Ecco un altro colpo a lui, con una spolverata di bltxd 's e Hsiu' risposte s, e, auspicabilmente, mantenendo come gran parte del spirito dell'originale grep
possibile (anche se è prolisso):
module Enumerable
def grepv(condition)
if block_given?
each do |item|
yield item if not condition === item
end
else
inject([]) do |memo, item|
memo << item if not condition === item
memo
end
end
end
end
Se fornisci un blocco, allora tutto è pigro come ti aspetteresti. Se non fornisci un blocco, c'è un piccolo codice duplicato. Mi auguro davvero che la risposta di Andrew Grimm sia applicata nel caso generale.
>> (%w(1 2 3) + [4]).cycle(3).grepv(Fixnum)
=> ["1", "2", "3", "1", "2", "3", "1", "2", "3"]
>> (%w(1 2 3) + [4]).cycle(3).grepv(/[12]/)
=> ["3", 4, "3", 4, "3", 4]
In nessuno dei due casi si fa a pagare fino a O(n^2)
per il confronto voce, come si farebbe nel caso peggiore se si fa matrice sottrazione.
Non credo. potresti crearne uno tu, però! – rogerdpack
'grep_v' è un metodo enumerabile da Ruby 2.3 – steenslag