Hier ist ein weiterer Schuss auf ihn, mit einer Prise bltxd ‚s und Hsiu‘ s Antworten und hoffentlich so viel von dem Geist der ursprünglichen grep
wie möglich (auch wenn es wortreich) beibehalten:
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
Wenn Sie einen Block liefern, dann ist alles faul wie Sie erwarten würden. Wenn Sie keinen Block bereitstellen, gibt es einen kleinen doppelten Code. Ich wünschte wirklich, dass Andrew Grimm 's Antwort im allgemeinen Fall anwendete.
>> (%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 keinem Fall tun Sie O(n^2)
für Artikel Vergleich zahlen, wie Sie es im schlimmsten Fall, wenn Sie Array Subtraktion tun.
Ich glaube nicht. Sie könnten jedoch selbst einen erstellen! – rogerdpack
'grep_v' ist eine Methode zum Aufzählen seit Ruby 2.3 – steenslag