Ruby 2.2 respond_to_missing?/method_missing/Object#method is not detecting properly
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
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.
Updated by nobu (Nobuyoshi Nakada) almost 7 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r50038.
proc.c: respond_to_missing? at Method
- proc.c (respond_to_missing_p): check if the receiver responds to the given method by respond_to_missing?.
- proc.c (mnew_missing): create Method object for method_missing. [ruby-core:68564] [Bug #10985]