I don't know if you guys realize there's a discussion about this going
at Ruby's Redmine, http://bugs.ruby-lang.org/issues/5588, and somebody
even whipped up some patches.

Changing the grep method instead of the regex seems like a much more
reasonable idea.


-- Matma Rex



2012/1/14 Peter Vandenabeele <peter / vandenabeele.com>:
> On Sat, Jan 14, 2012 at 2:24 PM, Robert Klemme
> <shortcutter / googlemail.com>wrote:
>
>> On Sat, Jan 14, 2012 at 1:51 PM, Josh Cheek <josh.cheek / gmail.com> wrote:
>> > On Sat, Jan 14, 2012 at 6:06 AM, Robert Klemme
>> > <shortcutter / googlemail.com>wrote:
>> >
>> >>
>> >> It's impossible because
>> >>
>> >> - you cannot change behavior of !
>> >>
>> >
>> > You can do this (I'm not advocating it), but IDK how you would actually
>> > negate it.
>> >
>> > class Regexp
>> > def !@
>> >  /some sort of negation of #{source}/
>> > end
>> > end
>> >
>> > abc = /abc/
>> > !abc # => /some sort of negation of abc/
>>
>> Oh, I wasn't aware of this. Thank you for the education!
>>
>> The way to use it would probably be to create a wrapper instance which
>> reverses semantics of the original's Regexp instance and sets global
>> variables accordingly (if this is possible; not sure in the case of
>> $1, $2 etc. because of their special nature).
>>
>> Still the other obstacle would prevent making !enum.grep(/foo/) return
>> what is intended. You could only do enum.grep(!/foo/). Theres a
>> potential though to break other code which relies on different boolean
>> behavior of Regexp instances so the approach with #grep_v or an
>> explicit Regexp#negate would be better.
>>
>
> I meant my earlier proposal
>
>> Negation could be an option for the Enumerable grep command
>
> more along these lines:
>
> describe "grep_with_options" do
>
> it "works as before with 1 arugment" do
>  %w{abc def ghi}.grep(/abc/).should == %w{abc}
> end
>
> it "negates the selection with 'v'" do
>  %w{abc def ghi}.grep(/abc/, 'v').should == %w{def ghi}
> end
>
> it "can be chained" do
>  %w{abc adf agh bcd efd}.grep(/^a/).grep(/c/,'v').should == %w{adf agh}
> end
>
> it "can select lines after with A" do
>  pending("TODO")
>  %w{abc def ghi}.grep(/abc/, 'A1').should == %w{abc def}
> end
>
> end
>
> # a naive implementation
> module Enumerable
> def grep(cond, *select_options)
>  negate_matches = select_options.include?('v')
>  if negate_matches
>   reject {|e| cond === e}
>  else
>   select {|e| cond === e}
>  end
> end
> end
>
> Just the 'v' option to grep would already be useful
> (and it would match with the request from the OP).
>
> There are other grep options that I use quite often too
> and could be implemented (-A -B -C -c ...) similarly.
>
> Peter