9
votes

Équivalent rubis à Grep -V

C'est ce que j'ai fait à la place:

my_array.reject { |elem| elem =~ /regex/ }.each { ... }


2 commentaires

Je ne le pense pas. Vous pouvez en créer un vous-même, cependant!


grep_v est une méthode d'énumérable depuis Ruby 2.3


10 Réponses :



1
votes

Vous pouvez faire:

my_array.reject{|e| e[/regex/]}.each { ... }


0 commentaires

3
votes

Je ne crois pas qu'il y ait quelque chose d'intégré comme celui-ci, mais c'est assez simple pour ajouter: xxx

Notez que vous devez utiliser des parens autour du regex lorsque vous appelez cette fonction, Sinon, vous obtenez une erreur de syntaxe: xxx


0 commentaires

0
votes

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


0 commentaires

6
votes

Que diriez-vous de cela? XXX

J'ai délibérément inclus un DUP pour vous assurer que tous sont retournés.


0 commentaires

0
votes

Merci à tous pour vos commentaires. En fin de compte, je l'ai fait de cette façon: xxx

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.

J'ai ajouté la partie ou to_s 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.


0 commentaires

7
votes

Vous savez comment symbole # to_proc aide au chute? Vous pouvez faire la même chose avec des expressions régulières: xxx

mais vous ne devriez probablement pas. Grep ne fonctionne pas simplement avec des expressions régulières - vous pouvez l'utiliser comme suit xxx

et si vous vouliez grep -v que, vous auriez à mettre en œuvre Classe # to_proc , ce qui semble faux.


1 commentaires

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



4
votes

Qu'en est-il d'inverser la regex? XXX


0 commentaires

0
votes

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 grep code> aussi possible (même si c'est Wordy): XXX Pré>

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>

>> (%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]


0 commentaires

17
votes

Ruby 2.3 implémente un énumérable # grep_v méthode qui est exactement ce que vous êtes après.

https://ruby-doc.org/ Core-2.3.0 / Enumérable.html # Method-i-grep_v


3 commentaires

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 IT: les gens avaient besoin de 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 . 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?