C'est ce que j'ai fait à la place:
my_array.reject { |elem| elem =~ /regex/ }.each { ... }
10 Réponses :
Vous pouvez faire:
my_array.reject{|e| e[/regex/]}.each { ... }
Je ne crois pas qu'il y ait quelque chose d'intégré comme celui-ci, mais c'est assez simple pour ajouter: Notez que vous devez utiliser des parens autour du regex lorsque vous appelez cette fonction, Sinon, vous obtenez une erreur de syntaxe: p>
Vous devez simplement nier le résultat du match Regexp.
Enumerable.module_eval do def grepv regexp if block_given? self.each do |item| yield item if item !~ regexp end else self.find_all do |item| item !~ regexp end end end end
Que diriez-vous de cela? J'ai délibérément inclus un DUP pour vous assurer que tous sont retournés. P> P>
Merci à tous pour vos commentaires. En fin de compte, je l'ai fait de cette façon: Je ne sais pas si c'est le meilleur moyen parce que je commence juste à commencer avec Ruby. C'est un peu plus long que les autres solutions des autres, mais j'aime bien, car il est assez analogue à l'option Grep d'être énumérable - cela fonctionne avec tout ce qui peut gérer le ===, tout comme Grep, et cela donne les articles qu'il trouve si un bloc était donné, et de toute façon renvoie un tableau de ceux qui ne correspondaient pas. p> J'ai ajouté la partie ou to_s code> afin que tous les entiers, par exemple, entrecoupés dans le tableau pourraient être assorti avec la même regex, même si je pouvais imaginer que cela pourrait parfois faire des choses. p> p>
Vous savez comment mais vous ne devriez probablement pas. Grep ne fonctionne pas simplement avec des expressions régulières - vous pouvez l'utiliser comme suit P> et si vous vouliez grep -v que, vous auriez à mettre en œuvre symbole # to_proc code> aide au chute? Vous pouvez faire la même chose avec des expressions régulières:
Classe # to_proc code>, ce qui semble faux. P> p>
Cette réponse capture l'esprit minimaliste de Ruby - dommage dommage qu'il n'y ait pas de moyen facile de le faire fonctionner de cette façon pour tous les comportements de grep
Qu'en est-il d'inverser la regex?
Voici un autre coup de poing, avec une sprinkling de bltxd et Les réponses de Hsiu et, espérons-le, retenir autant d'esprit de l'original Si vous fournissez un bloc, tout est paresseux comme vous l'attendez. Si vous ne fournissez pas de bloc, il y a un petit code en double. Je souhaite vraiment que Andrew Grimm de la réponse de Andrew Grimm est appliquée dans l'affaire Général. P> grep code> aussi possible (même si c'est Wordy):
>> (%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]
Ruby 2.3 implémente un https://ruby-doc.org/ Core-2.3.0 / Enumérable.html # Method-i-grep_v p> énumérable # grep_v code> méthode qui est exactement ce que vous êtes après. p>
La question évidente est la raison pour laquelle Grepv n'a pas été créé lorsque Grep était - je trouve Ruby une langue incroyablement chaotique.
@ Android.weasel Je ne "défendre" pas son absence antérieure, mais il a fallu jusqu'à 2012 avant que quelqu'un demandé il ; Recherchez le principe de Yagni. Pour la raison pour laquelle il a fallu si longtemps pour l'ajouter: lors de l'ajout d'une nouvelle fonctionnalité de base à une langue largement utilisée, prudence et discussion sont appelées. Si l'API est clunky / non intuitif, il brisera le code existant pour la modifier après l'adoption des utilisateurs; L'alternative consiste à ajouter une nouvelle API et à déprécier l'ancien. Lire: Messy. L'évolution semble souvent chaotique du recul.
@kelvin Il a fallu jusqu'à présent pour que quelqu'un demande i> IT: les gens avaient besoin de i> cela auparavant. Yagni est bon pour la programmation générale, qui est un mélange de conception et de découverte, mais les développeurs de langues et les grands designers de bibliothèques ne font que faire des choses pour leurs propres projets: concevoir correctement, ils ont besoin de penser aux autres ' Besoins I>. Select / Rejeter et si / à moins d'une technique antérieure évidente, omis de mettre en œuvre Grepv à partir du début, il suffit d'illustre ce type d'échec. Ruby intègre de nombreuses erreurs Les langues précédentes avaient déjà "évolué" au-delà. Tromper moi une fois, hein?
Je ne le pense pas. Vous pouvez en créer un vous-même, cependant!
grep_v code> est une méthode d'énumérable depuis Ruby 2.3