Bug #10985


Ruby 2.2 respond_to_missing?/method_missing/Object#method is not detecting properly

Added by michaelherold (Michael Herold) over 8 years ago. Updated over 8 years ago.

Target version:


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


Also available in: Atom PDF