Project

General

Profile

Bug #11017

overridden method Hash#[]= doesn't return correct data

Added by vladislav.zubov (Vladislav Zubov) over 4 years ago. Updated over 4 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
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?

History

#1

Updated by jeremyevans0 (Jeremy Evans) over 4 years ago

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.

#2

Updated by vladislav.zubov (Vladislav Zubov) over 4 years ago

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.

#3

Updated by nobu (Nobuyoshi Nakada) over 4 years ago

  • Description updated (diff)
  • Status changed from Open to Rejected

Also available in: Atom PDF