On Sep 1, 2015, at 6:29 AM, Yves-Eric <yemar...@gmail.com> wrote: > Hi all, > > > I think I have stumbled upon a bug in HashWithIndifferentAccess. > I cannot pinpoint it exactly, but I have written a small test case that > exhibits the buggy behavior: > > https://gist.github.com/yemartin/54db7476aa41b85e7eb8 > > The same code works fine if we use a regular Hash for `@store` instead of a > HashWithIndifferentAccess. > Is this a known issue or should I fill a bug report?
This code in your example: @store[:foo] ||= {bar: 'BAR'} does not do what you may be thinking it does. HWIA overrides the `[]=` operator: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/hash_with_indifferent_access.rb#L96 to convert incoming plain Hash objects into HWIA. So the object that eventually is stored in `@store[:foo]` is NOT the one that was passed to the assignment operator. You can check this explicitly: require 'active_support/all' @store = ActiveSupport::HashWithIndifferentAccess.new def my_hash @store[:foo] ||= {bar: 'BAR'} end first_time = my_hash # => {:bar =>”BAR”} second_time = my_hash # => {“bar”=>”BAR”} Note that `first_time` and `second_time` don’t have matching `inspect` results. Assignment operators *always* return the value passed on the right-hand side, regardless of what the underlying `[]=` method returns. This means that in cases where the object doesn’t require conversion (coalwater’s modification from your Gist) the object returned from `||=` DOES match, and Waldo is found. Not sure if there’s a fix for this - the converting-on-[]= behavior is something many applications are likely to depend on, and the behavior of assignment operators is a core Ruby issue. —Matt Jones -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at http://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.
signature.asc
Description: Message signed with OpenPGP using GPGMail