From: "jeremyevans0 (Jeremy Evans)" Date: 2022-07-30T22:38:44+00:00 Subject: [ruby-core:109387] [Ruby master Feature#18950] Hash#slice fails to copy default block Issue #18950 has been updated by jeremyevans0 (Jeremy Evans). Backport deleted (2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN) ruby -v deleted (2.7.6) Tracker changed from Bug to Feature Hash#slice documentation states it returns a new hash object, not a modified copy of the receiver. A new hash object by default does not have a default value or block. Hash#slice doesn't copy the default value either: `Hash.new(0).slice(:a)[1] # => nil`. I don't think the current behavior is a bug, as there should be no expectation of the default value and block being copied. Hash#except, #select, #transform_keys, #transform_values, and maybe other methods that return new hashes and not modified copies do not copy over the default value or block. That being said, this seems like a reasonable feature request. ---------------------------------------- Feature #18950: Hash#slice fails to copy default block https://bugs.ruby-lang.org/issues/18950#change-98536 * Author: RubyBugs (A Nonymous) * Status: Open * Priority: Normal ---------------------------------------- An intense weekend debugging session discovered the following root cause of a bug: `Hash#slice` returns a new Hash, which has no default block set, even if the source Hash did have a default block set. Simplified code to reproduce: ``` ruby # Default to an empty hash for all accessed keys hash_with_default = Hash.new { |h, k| h[k] = {} } # => {} hash_with_default[:a] # => {} hash_with_default[:b] # => {} hash_with_default # => {:a=>{}, :b=>{}} # Later, use Hash#slice hash_sliced = hash_with_default.slice(:a, :b) # => {:a=>{}, :b=>{}} # Finally, access a new key hash_sliced[:c] # => nil # Error -- that was expected to call the default block raise "No default value" unless hash_sliced[:c] == {} ``` -- https://bugs.ruby-lang.org/ Unsubscribe: