[ruby-core:105828] [Ruby master Feature#16252] Hash#partition should return hashes
From:
"Dan0042 (Daniel DeLorme)" <noreply@...>
Date:
2021-10-27 14:31:45 UTC
List:
ruby-core #105828
Issue #16252 has been updated by Dan0042 (Daniel DeLorme).
FWIW, current usage in gems is consistent with Hash, but I did find one incompatibility.
actionpack-6.0.0/lib/action_dispatch/routing/mapper.rb
267: constraints.partition do |key, requirement|
subarrays then converted with `Hash[subarray]`
capybara-3.29.0/lib/capybara/selector/definition/element.rb
21: booleans, values = options.partition { |_k, v| [true, false].include? v }.map(&:to_h)
subarrays converted with `.map(&:to_h)`
fog-openstack-1.0.9/lib/fog/openstack/image/v1/models/images.rb
32: custom_properties, params = headers.partition do |k, _|
subarrays converted with `.map { |p| Hash[p] }`
fugit-1.3.3/lib/fugit/duration.rb
71: INFLA_KEYS, NON_INFLA_KEYS =
72: KEYS.partition { |k, v| v[:I] }
subarrays iterated with `.each do |k, a|`
**However** there is incompatibility with `keys = INFLA_KEYS.dup; keys.unshift([ :mon, { s: Fugit::Duration.parse(mon).to_sec } ])`
sequel-5.24.0/lib/sequel/plugins/auto_validations.rb
167: not_null_cols, explicit_not_null_cols = db_schema.select{|col, sch| sch[:allow_null] == false}.partition{|col, sch| sch[:default].nil?}.map{|cs| cs.map{|col, sch| col}}
subarrays converted to keys with `.map{|cs| cs.map{|col, sch| col}}` would have same result with hash but could be written `.map(:keys)` instead
sprockets-3.7.2/lib/sprockets/cache/file_store.rb
167: delete_caches, keep_caches = caches.partition { |filename, stat|
subarrays compatible with hash: `.map(&:first)` and `.inject(0) { |sum, (_, stat)|`
----------------------------------------
Feature #16252: Hash#partition should return hashes
https://bugs.ruby-lang.org/issues/16252#change-94351
* Author: Dan0042 (Daniel DeLorme)
* Status: Open
* Priority: Normal
----------------------------------------
Hash#partition is implemented by Enumerable so it just returns two arrays of arrays
```ruby
{1=>2,3=>4}.partition{|k,|k==1} #=> [[[1, 2]], [[3, 4]]]
```
But I think it would make more sense to behave similarly to Hash#select and Hash#reject
```ruby
{1=>2,3=>4}.partition{|k,|k==1} #=> [{1=>2}, {3=>4}]
```
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>