Weißt du, wie Symbol#to_proc
beim Verketten hilft? Sie können das gleiche mit regulären Ausdrücken tun:
Aber Sie sollten es wahrscheinlich nicht tun. Grep funktioniert nicht nur mit regulären Ausdrücken - Sie können es wie folgt verwenden
%Vor% und wenn du grep -v willst, musst du Class#to_proc
implementieren, was falsch klingt.
Ruby 2.3 implementiert eine Enumerable#grep_v
-Methode, die genau das ist, wonach Sie suchen.
Sie können:
%Vor% Aber es ist wirklich schwer, prägnanter und selbstdokumentierend zu sein. Es könnte geschrieben werden mit grep(/.../)
mit einigen negativen Lookahead-Muster, aber dann denke ich, es wird schwieriger, die gesamte Aktion zu verstehen, weil das Muster selbst schwerer zu verstehen ist.
Vielen Dank für Ihre Kommentare. Am Ende habe ich es so gemacht:
%Vor%Ich bin mir nicht sicher, ob das der beste Weg ist, weil ich gerade mit Ruby anfange. Es ist hier ein wenig länger als die Lösungen anderer Leute, aber ich mag es, weil es ziemlich analog zur grep -Option von Enumerable ist - es funktioniert mit allem, was mit dem ==5, genau wie grep, zusammenhängt und die gefundenen Elemente liefert, wenn ein Block gefunden wurde gegeben, und beide Wege gibt ein Array von denen, die nicht übereinstimmen.
Ich habe den or to_s
-Teil hinzugefügt, damit alle Integer, die beispielsweise im Array vorkommen, mit demselben Regex verglichen werden können, obwohl ich mir vorstellen könnte, dass dies manchmal Probleme verursachen könnte.
Versuchen Sie es mit Array#collect!
BEARBEITEN: Entschuldigung, dann müssten Sie Array#compact
nachher aufrufen. Zumindest würde das den zweiten Block eliminieren. Aber es ist mehr physikalischer Code. Es hängt davon ab, wie viel "Zeug" du tust.
Hier ist eine weitere Einstellung, mit einer Prise bltxd und Hsiu die Antworten und hoffentlich so viel von der ursprünglichen grep
wie möglich behalten (auch wenn es wortreich ist):
Wenn Sie einen Block bereitstellen, ist alles faul, wie Sie es erwarten würden. Wenn Sie keinen Block bereitstellen, gibt es einen kleinen doppelten Code. Ich wünsche mir wirklich, dass Andrew Grimm die Antwort im allgemeinen Fall gilt.
%Vor% In beiden Fällen zahlen Sie für den Artikelvergleich nicht O(n^2)
, wie Sie es im schlimmsten Fall tun würden, wenn Sie eine Array-Subtraktion durchführen.