Project

General

Profile

Actions

Bug #10985

closed

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

Added by michaelherold (Michael Herold) about 7 years ago. Updated about 7 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:<unknown>]

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.

Actions

Also available in: Atom PDF