Project

General

Profile

Actions

Feature #19324

open

Enumerator.product => Enumerable#product

Added by zverok (Victor Shepelev) almost 2 years ago. Updated 8 months ago.

Status:
Assigned
Target version:
-
[ruby-core:111739]

Description

I know it might be too late after introducing a feature and releasing a version, but I find Enumerator.product quite confusing, and can't find any justification in #18685.

Problem 1: It is Array#product but Enumerator.product

[1, 2].product([4, 5])
# => [[1, 4], [1, 5], [2, 4], [2, 5]]

# Usually, when we add methods to Enumerable/Enumerator which
# already array had before, it is symmetric, say...
[1, nil, 2, 3].compact #=> [1, 2, 3]
[1, nil, 2, 3].lazy.compact.first(2) #=> [1, 2]

# But not in this case:
[1, 2].lazy.product([4, 5]).first(2)
# undefined method `product' for #<Enumerator::Lazy: [1, 2]> (NoMethodError)
# Because you "just" need to change it to:
Enumerator.product([1, 2].lazy, [4, 5]).first(2)
# => [[1, 4], [1, 5]]

No other method was "promoted" from Array this way

And in general, I believe core methods tend to belong to the first object in the expression and not be free module methods, Elixir style.

Problem 2: It is one letter different from Enumerator.produce

I understand I might be biased here (as a person who proposed produce), and that method is not as popular (yet?) as I hoped, but still, two methods that do completely different things and differ by one letter, both being somewhat vague verbs (so it is easy to confuse them unless you did a lot of math and "product" is firmly set for set product in your head).

I believe that EITHER of two problems would be concerning enough, but the combination of them seems to be a strong enough argument to make the change?.. (Maybe with graceful deprecation of module method in one next version, but, considering the Ruby 3.2 is just released, maybe vice versa, fix the problem in the next minor release?..)


Related issues 2 (1 open1 closed)

Related to Ruby master - Feature #6499: Array::zipRejectedmatz (Yukihiro Matsumoto)05/26/2012Actions
Related to Ruby master - Feature #8970: Array.zip and Array.productOpenActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like1Like0Like0Like1Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0