Feature #8921

Allow select, reject, etc to accept a regex

Added by Kyle Decot 7 months ago. Updated 6 months ago.

[ruby-core:57262]
Status:Open
Priority:Normal
Assignee:-
Category:-
Target version:-

Description

=begin
It would be really handy if for instance (({select})) could accept a regex. For example

%w[foo bar baz].select /ba/ # ["bar", "baz"]

I know that this is currently possible via the slightly longer syntax

%w[foo bar baz].select{|i| i[/ba/] } # ["bar", "baz"]
=end

History

#1 Updated by Hans Mackowiak 7 months ago

1) it can be done via

class Regexp
def to_proc
proc {|o| self.match(o) }
end
end

2) but i think the method you are looking for is grep
%w[foo bar baz].grep /ba/ # => ["bar", "baz"]

#2 Updated by Kyle Decot 7 months ago

=begin
Yes, grep would be a suitable alternative for select w/ a regex in this instance. What about for reject though? I feel that

%w[foo bar baz].reject /^ba/ # ["foo"]

Is more readable than

%w[foo bar baz].grep /^[^ba]/ # ["foo"]

Using reject also makes it so that I don't have to rewrite my regular expression to negate what I'm looking for. My example is pretty trivial but I think that it would quickly get out of hand if trying to grep things "out" instead of "in".
=end

#3 Updated by Fuad Saud 7 months ago

Shouldn't select/reject use threequals?
On Sep 18, 2013 12:25 PM, "kyledecot (Kyle Decot)" kyle.decot@icloud.com
wrote:

Issue #8921 has been updated by kyledecot (Kyle Decot).

=begin
Yes, grep would be a suitable alternative for select w/ a regex in this
instance. What about for reject though? I feel that

%w[foo bar baz].reject /^ba/ # ["foo"]

Is more readable than

%w[foo bar baz].grep /^[^ba]/ # ["foo"]

Using reject also makes it so that I don't have to rewrite my regular
expression to negate what I'm looking for. My example is pretty trivial but
I think that it would quickly get out of hand if trying to grep things
"out" instead of "in".

=end

Feature #8921: Allow select, reject, etc to accept a regex
https://bugs.ruby-lang.org/issues/8921#change-41882

Author: kyledecot (Kyle Decot)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:

It would be really handy if for instance select could accept a regex.
For example

%w[foo bar baz].select /^ba/ # ["bar", "baz"]

I know that this is currently possible via the slightly longer syntax

%w[foo bar baz].select{|i| i[/^ba/] } # ["bar", "baz"]

http://bugs.ruby-lang.org/

#4 Updated by Fuad Saud 7 months ago

I mean, couldn't select, reject and friends take one parameter in case no
block is passed and compare elements using the threequals operator. This
would enable one to do things like:

[1, 56, 12, 7, 39].select 0..20 #=> [1, 12]
%w( foo bar baz ).reject /ba/ #=> [foo]

On Wednesday, September 18, 2013, Fuad Saud wrote:

Shouldn't select/reject use threequals?
On Sep 18, 2013 12:25 PM, "kyledecot (Kyle Decot)" >
wrote:

Issue #8921 has been updated by kyledecot (Kyle Decot).

=begin
Yes, grep would be a suitable alternative for select w/ a regex in this
instance. What about for reject though? I feel that

%w[foo bar baz].reject /^ba/ # ["foo"]

Is more readable than

%w[foo bar baz].grep /^[^ba]/ # ["foo"]

Using reject also makes it so that I don't have to rewrite my regular
expression to negate what I'm looking for. My example is pretty trivial but
I think that it would quickly get out of hand if trying to grep things
"out" instead of "in".

=end

Feature #8921: Allow select, reject, etc to accept a regex
https://bugs.ruby-lang.org/issues/8921#change-41882

Author: kyledecot (Kyle Decot)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:

It would be really handy if for instance select could accept a regex.
For example

%w[foo bar baz].select /^ba/ # ["bar", "baz"]

I know that this is currently possible via the slightly longer syntax

%w[foo bar baz].select{|i| i[/^ba/] } # ["bar", "baz"]

http://bugs.ruby-lang.org/

--
Fuad Saud

twitter http://twitter.com/fuadsaud |
linkedinhttp://www.linkedin.com/in/fuadksd|
coderwall http://coderwal.com/fuadsaud | githubhttp://github.com/fuadsaud|

#5 Updated by Nobuyoshi Nakada 7 months ago

  • Description updated (diff)

#6 Updated by Anonymous 7 months ago

On 09/18/2013 09:17 AM, Fuad Saud wrote:

I mean, couldn't select, reject and friends take one parameter in case
no block is passed and compare elements using the threequals operator.
This would enable one to do things like:

[1, 56, 12, 7, 39].select 0..20 #=> [1, 12]
%w( foo bar baz ).reject /ba/ #=> [foo]

And then, because of Proc#===, there is this symmetry:

big = proc {|x| x>10}
=> #Proc:0x007f4770fcd730@(irb):7
[1,2,34].select &pr
=> [34]
[1,2,34].select pr
=> [34] # with proposed change

#7 Updated by Boris Stitnicky 7 months ago

@Hanmac: That's it, thanks!

#8 Updated by Nobuyoshi Nakada 7 months ago

That is grep.

#9 Updated by Kyle Decot 7 months ago

Again, I understand that grep can do this but I feel that (especially in my reject example) that the intent is much clearer w/ my proposed addition. What would be the downside to adding something like this to select/reject (or Enumberable in general)?

#10 Updated by Fuad Saud 6 months ago

Hey nobu have you thought about this? I think it's a pretty interesting change to be introduced.

Also available in: Atom PDF