Feature #11049
closed
Enumerable#grep_v (inversed grep)
Added by sorah (Sorah Fukumori) over 9 years ago.
Updated over 9 years ago.
Description
sometime I want to do grep -v
like operation:
%w(aaa bbb ccc).reject { |x| /b/ === x } #=> ["aaa", "ccc"]
We already have Enumerable#grep, so I propose to add Enumerable#grep_v.
%w(aaa bbb ccc).grep(/b/) #=> ["bbb"]
%w(aaa bbb ccc).grep_v(/b/) #=> ["aaa", "ccc"]
Naming / Interface¶
This idea is mentioned at DevelopersMeeting20150408Japan by me. Matz has said "I don't disagree for the feature. So this remains naming (interface) problem."
I'm not sure grep_v is the best name for this feature; feedback are welcomed.
Ideas¶
-
grep_v(pattern)
(the first patch)
grep(pattern, inverse: true)
grep!(pattern)
Files
How about implementing Regexp#invert
instead?
/b/.invert #=> /[^(?:b)]/
Like this for example:
class Regexp
def invert
self.class.new("[^(?:#{source})]")
end
end
%w(aaa bbb ccc).grep(/b/) #=> ["bbb"]
%w(aaa bbb ccc).grep(/b/.invert) #=> ["aaa", "ccc"]
Recursive Madman wrote:
How about implementing Regexp#invert
instead?
Like this for example:
class Regexp
def invert
self.class.new("[^(?:#{source})]")
end
end
That only works for some regexps, I doubt there is a proper and well defined inverted regexp for any Regexp.
grep(pattern, inverse: true) seems the least surprising to me.
But of course it does not buy much compared to #reject.
Benoit Daloze wrote:
That only works for some regexps, I doubt there is a proper and well defined inverted regexp for any Regexp.
Could you provide an example that doesn't work?
Recursive Madman wrote:
Benoit Daloze wrote:
That only works for some regexps, I doubt there is a proper and well defined inverted regexp for any Regexp.
Could you provide an example that doesn't work?
class Regexp
def invert
self.class.new("[^(?:#{source})]")
end
end
%w(aaa bbb ccc).grep(/abc/) #=> []
%w(aaa bbb ccc).grep(/abc/.invert) #=> []
invert
looks same as my proposal, Regexp#!
.
How is this proposal different from #9602? I thought that Matz had already suggested to modify select
, and Sam Rawlins had implemented select
and reject
.
- Assignee set to matz (Yukihiro Matsumoto)
Recursive Madman wrote:
How about implementing Regexp#invert
instead?
As grep using the case statement this would be ignoring a lot of cases that would be handy:
array.invert_grep(Array) # Select all elements that are not arrays.
grep_v
seems OK. Accepted.
Matz.
- Status changed from Open to Closed
Thanks, committed at r50491, r50492.
- Related to Feature #8921: Allow select, reject, etc to accept a regex added
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0