[ruby-core:123322] [Ruby Feature#21615] Introduce `Array#values`
From:
"matheusrich (Matheus Richard) via ruby-core" <ruby-core@...>
Date:
2025-09-24 02:26:42 UTC
List:
ruby-core #123322
Issue #21615 has been updated by matheusrich (Matheus Richard).
> I think it should be Array.new(*self).
I can do that, sure.
> That word is negative to convince us.
Noted! Good to know.
> Why not to introduce Array#each_value?
I think it feels clunkier than `array.values.each`, but is an alternative I considered. IMO it still makes me expect that a `#values` method would exist since it would be a word present in `values_at`, `fetch_values` and `each_value`.
IMO *both* could be added, so Array has an interface even more similar to Hash, but I decided to keep this small.
----------------------------------------
Feature #21615: Introduce `Array#values`
https://bugs.ruby-lang.org/issues/21615#change-114686
* Author: matheusrich (Matheus Richard)
* Status: Open
----------------------------------------
## Motivation
In Ruby code, it's common to accept arrays and hashes and treat them uniformly as collections of values. `Hash` exposes `#values`, but `Array` does not, which pushes developers toward `is_a?`/`respond_to?` branching.
Following the **Principle of Least Surprise**, users may reasonably expect `Array#values` to exist because:
* Both `Array` **and** `Hash` already implement `#values_at`.
* `Hash` implements `#values` but `Array` does not.
### Example
Today:
```ruby
def normalize_records(input)
items = input.respond_to?(:values) ? input.values : input
items.each do |item|
do_stuff_with_item(item)
end
end
```
With `Array#values`:
```ruby
def normalize_records(input)
input.values.each do |item|
do_stuff_with_item(item)
end
end
```
## Proposal
Add `Array#values`, returning `self`. Implementation could simply alias to `itself`:
```ruby
class Array
alias_method :values, :itself
end
```
This yields a uniform interface for `Array` and `Hash` values without type checks.
### Alternatives considered
* `Enumerable#values`: defaulting to `to_a`, but I found it too broad of a change.
* `Array#each_value`: redundant as `Array#each` already covers iteration.
Patch: https://github.com/ruby/ruby/pull/14641
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/