Thanks Matt, your analysis is spot on. So the root cause actually a core 
behavior of Ruby. I found this pretty good explanation too on StackOverflow:

http://stackoverflow.com/questions/19033909/why-isnt-method-treated-the-same-as-any-other-method

So, it looks like this cannot be fixed, huh....



On Wednesday, 2 September 2015 05:21:38 UTC+9, Matt jones wrote:
>
>
> On Sep 1, 2015, at 6:29 AM, Yves-Eric <yema...@gmail.com <javascript:>> 
> 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.

Reply via email to