On Sep 1, 2015, at 6:29 AM, Yves-Eric <[email protected]> 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 [email protected].
To post to this group, send email to [email protected].
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
