Project

General

Profile

Feature #14763

Allow more Enumerable methods to accept method names as symbol arguments

Added by sunnyrjuneja (Sunny Juneja) 5 months ago. Updated 5 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:87051]

Description

Enumerable has a short hand which accepts method names as symbols.

(5..10).reduce(:+) #=> 45

I'm proposing we allow the same functionality for #any?, #all?, #find, #reject, #select, #one?, #find_index. I'm requesting this because when I did this earlier today and it did not meet my expectations:

[2,4,6].all?(:even?) #=> false
  • Any risk of incompatibility? I don't believe so. As of now, #any? accepts an argument and compares using ===. The following is current behavior:
[Symbol].any?(:even?) #=> false
[:symbol].any?(:even?) #=> false
[].all?(:even?) #=> true

Thanks for consideration of this request. I've used Ruby for 6 years and this is my first feature request. I understand if it is not a high priority or interesting to the maintainers. I am happy to try to add an implementation if it is interesting.

History

#1 [ruby-core:87054] Updated by shevegen (Robert A. Heiler) 5 months ago

Is there any reason why you did use ":even?" rather
than ":even"?

[2,4,6].all?(:even)

To me symbols with a question mark seem somewhat unusual
or rare.

However had, my question is mostly a small detail, in my
opinion, not the bigger picture. I understand the intent
of the code e. g. query ruby for all even/odd numbers,
through the use of a Symbol.

I am mostly neutral on the proposal itself and slightly in
favour, primarily because I like symbols and I think there
is no problem with it. It should, if accepted, be documented
somewhere though.

My suggestion would be to have matz decide on it soon, simply
so that you can know whether matz is in favour or against it.

I would not worry about the priority - there have been lots of
cases where low priority issues have been added/implemented.

If you would like to, you could add your issue at:

https://bugs.ruby-lang.org/issues/14698

And someone can mention it for discussion at the
developer meeting. That is one of the best ways
to ask matz directly. :)

(I myself won't suggest your issue request because I
think that it is your suggestion, so you should be
in full control over as to whether you want to have
it discussed or not, not me.)

By the way, there have been proposals accepted that
re-use Symbols meaning.

https://github.com/ruby/ruby/blob/trunk/NEWS

See the various Kernel.# methods that use :exception.

I think there is nothing wrong with such special
meanings; just that it should be documented, so
that ruby hackers can know what to use.

#2 [ruby-core:87055] Updated by sunnyrjuneja (Sunny Juneja) 5 months ago

Hey Shevegen,

Thank you for your comments. I really apperciate them! I'll respond inline:

shevegen (Robert A. Heiler) wrote:

Is there any reason why you did use ":even?" rather
than ":even"?

[2,4,6].all?(:even)

The only reason I used :even? rather than :even is because Integer has a method called even?. In this case, my example is a shorthand for

[2, 4, 6].all? { |x| x.even? }

I just wanted to show an example with a real method.

I am mostly neutral on the proposal itself and slightly in
favour, primarily because I like symbols and I think there
is no problem with it. It should, if accepted, be documented
somewhere though.

That's a very good point. I forgot to mention it in my original proposal but I wanted to document in the same way inject does. See: http://ruby-doc.org/core-2.5.1/Enumerable.html#method-i-inject

It reads:

inject(sym) -> obj
# Sum some numbers
(5..10).reduce(:+)

If you would like to, you could add your issue at:

https://bugs.ruby-lang.org/issues/14698

Thank you! I had no such idea of such a meeting. I will add it to the issue now.

#3 [ruby-core:87057] Updated by sawa (Tsuyoshi Sawada) 5 months ago

I think reduce or inject taking a method name as an argument was convenient in the old days when symbol to proc was not available. Today, this feature of reduce and inject does not have the significance it used to have, and should rather be removed because you can just add an ampersand in front of the method name.

Why can't you just add an ampersand in front of the method name? It is not of a big deal.

#4 [ruby-core:87058] Updated by sunnyrjuneja (Sunny Juneja) 5 months ago

sawa (Tsuyoshi Sawada) wrote:

I think reduce or inject taking a method name as an argument was convenient in the old days when symbol to proc was not available. Today, you can just add an ampersand in front of the method name.

Why can't you just add an ampersand in front of the method name? It is not of a big deal.

This did not occur to me. Thanks for the reminder. I am happy to remove my request but I am unable to close the issue.

#5 [ruby-core:87068] Updated by nobu (Nobuyoshi Nakada) 5 months ago

I think that this is not acceptable due to the backward compatibility.
[2].all?(:even?) returns false now, but it would be true if this is introduced.
The behavior changes from === to send by the argument class, it doesn't seem very predictable when the argument is not a literal expression.

#6 [ruby-core:87381] Updated by ujihisa (Tatsuhiro Ujihisa) 5 months ago

  • Status changed from Open to Closed

closing this on behalf of sunnyrjuneja

Also available in: Atom PDF