From: vladislav.zubov@... Date: 2015-03-30T20:20:51+00:00 Subject: [ruby-core:68699] [Ruby trunk - Bug #11017] overridden method Hash#[]= doesn't return correct data Issue #11017 has been updated by Vladislav Zubov. Jeremy Evans wrote: > Vladislav Zubov wrote: > > ~~~ > > > ps = HashWithIndifferentAccess.new({ first: 'first', second: 'second' }) > > # => {:first=>"first", :second=>"second"} > > > temp_hash = ps[:test] = {} > > result class is HashWithIndifferentAccess > > # => {} > > > temp_hash.class > > # => Hash > > ~~~ > > I see what method HashWithIndifferentAccess#[]= return Hash object but should HashWithIndifferentAccess. > > > > This is a bug? > > No. In ruby, assignment always returns the right hand side, it doesn't matter what the assignment method returns. So temp_hash is the argument you passed to HashWithIndifferentAccess#[]= (a plain hash). But ps[:test] should be a HashWithIndifferentAccess. Hello Jeremy Evans, thank you. Now all fit in the head. I close this issue. ---------------------------------------- Bug #11017: overridden method Hash#[]= doesn't return correct data https://bugs.ruby-lang.org/issues/11017#change-51986 * Author: Vladislav Zubov * Status: Open * Priority: Normal * Assignee: * ruby -v: ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0] * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- Hello all. I took the code from the active_support and its simplified ### hash_with_indifferent_access.rb ``` class HashWithIndifferentAccess < Hash def initialize(constructor = {}) if constructor.is_a?(Hash) super() update(constructor) else super(constructor) end end alias_method :hash_writer, :[]= def []=(key, value) result = hash_writer(key, convert_value(value)) puts "result class is #{result.class}" result end def convert_value(value, options = {}) if value.is_a? Hash HashWithIndifferentAccess.new(value) else value end end end ``` If run this is code that it return incorrent data: ~~~ > ps = HashWithIndifferentAccess.new({ first: 'first', second: 'second' }) # => {:first=>"first", :second=>"second"} > temp_hash = ps[:test] = {} result class is HashWithIndifferentAccess # => {} > temp_hash.class # => Hash ~~~ I see what method HashWithIndifferentAccess#[]= return Hash object but should HashWithIndifferentAccess. This is a bug? -- https://bugs.ruby-lang.org/