From: zverok.offline@... Date: 2019-12-27T20:04:03+00:00 Subject: [ruby-core:96523] [Ruby master Bug#16457] Invisible keys on hash when defining hash with Hash.new({}) Issue #16457 has been updated by zverok (Victor Shepelev). ```ruby my_hash = Hash.new({}) my_hash[:my_key].merge!(value: '') id = my_hash.default.object_id p ObjectSpace.each_object.find { |o| o.object_id == id } #=> {:value=>""} -- it exists my_hash = nil # allow myhash __and its default__ to be garbage-collected GC.start # collect garbage p ObjectSpace.each_object.find { |o| o.object_id == id } # try to find it #=> nil -- no such object, yes, it got collected ``` ---------------------------------------- Bug #16457: Invisible keys on hash when defining hash with Hash.new({}) https://bugs.ruby-lang.org/issues/16457#change-83454 * Author: Farhad (Farhad Eyvazli) * Status: Rejected * Priority: Normal * Assignee: * Target version: * ruby -v: 2.6.3 * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- When using ``` Hash.new()``` to initialize a hash, we all know for undefined it will return specific value which sent as a parameter to the ```Hash.new`` But when doing something like that keys get invisible ```ruby my_hash: Hash.new({}) my_hasy[:my_key] #=> {} my_hash[:my_key].merge!(value: '') my_hash.keys #=> [] my_hash.fetch(:my_key) #=> KeyError: key not found: :my_key my_hash.dig(:my_key) #=> {:value=>""} my_hash[:my_key] #=> {:value=>""} ``` Maybe it's normal behavior because, for each missing key, it initialize new empty has and merge it to that. But I'm not sure it can cause a memory leak or not when removing the main hash (:my_hash) -- https://bugs.ruby-lang.org/ Unsubscribe: