Вот еще один выстрел, с разбрызгиванием ответов bltxd и Hsiu , и мы надеемся сохранить как можно больше духа оригинального grep
(даже если это многословно):
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
Если вы поставите блок, то все будет ленивым, как и следовало ожидать.Если вы не предоставите блок, есть небольшой дублирующий код.Мне бы очень хотелось, чтобы ответ Эндрю Гримма был применен в общем случае.
>> (%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]
Ни в одном случае вы не платите до O(n^2)
за сравнение предметов, как вхудший случай, если вы делаете вычитание массива.