Aquí hay otro tiro en él, con una rociada de bltxd 's y Hsiu' respuestas s, y es de esperar que conserva la mayor cantidad de espíritu del original grep
como sea posible (incluso si es prolijo):
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
Si proporciona un bloque, todo es flojo como cabría esperar. Si no proporciona un bloque, hay un pequeño código duplicado. Realmente deseo que la respuesta de Andrew Grimm se aplique en el caso general.
>> (%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]
En ninguno de los casos hacen que paga hasta O(n^2)
elemento de comparación, al igual que lo haría en el peor de los casos si lo hace matriz resta.
No lo creo. ¡podrías crear uno tú mismo! – rogerdpack
'grep_v' es un método enumerable ya que Ruby 2.3 – steenslag