Bug #10985
closedRuby 2.2 respond_to_missing?/method_missing/Object#method is not detecting properly
Description
I'm one of the maintainers of the hashie gem. We had some reports that one of our specs started failing with Ruby 2.2 (and it was failing in ruby-head before then, but no one noticed), where Object#method
was not picking up a respond_to_missing?
/method_missing
combo for our dynamic setters. This only occurs when we are dynamically constructing the method name from a string.
I have isolated the issue out into a tiny sample project that shows the issue. You can see that sample on Github. That repository is set up to have Travis run on Ruby 2.1.5, 2.2.0, 2.2.1, and ruby-head to show that the issue is introduced in the 2.2 line.
I'm having trouble isolating the issue down at the C level, but from a Ruby level, it seems that dynamically constructed symbols aren't the same as explicitly constructed (i.e. fully typed out) symbols. Using the syntax from my little test repository:
widget = Widget.new
widget.method(:abc=) #=> This is found
widget.method("abc=") #=> This is found because it has previously been accessed via a symbol
widget.method("xyz=") #=> This is NOT found
widget.method(:xyz=) #=> This is found
widget.method("xyz=") #=> Now this is found because it was previously accessed via a symbol
Because of that behavior, it makes me think that something is happening with the conversion of the argument to a symbol, but that could be way off.
Please let me know if the explanation is vague. I'm happy to provide any more information that you would find helpful.