The []= operator should still return whatever it sets, though, which would
mean the two different accesses should return the same thing. And I believe
this is the case currently. To not do so would be a legitimate bug.

What version of Rails is the example using?

On Tue, Sep 1, 2015 at 4:21 PM, Matt Jones <[email protected]> wrote:

>
> 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.
>

-- 
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.

Reply via email to