Bug #11017
closed
overridden method Hash#[]= doesn't return correct data
Added by vladislav.zubov (Vladislav Zubov) about 9 years ago.
Updated about 9 years ago.
ruby -v:
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin12.0]
[ruby-core:<unknown>]
Description
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 incorrect 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?
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
.
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.
Close please this issue. I don't find close button.
- Description updated (diff)
- Status changed from Open to Rejected
Also available in: Atom
PDF
Like0
Like0Like0Like0