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.