Issue #13129 has been updated by kch (Caio Chassot).


I was just bit by this and took a while to figure out.

It's not immediately obvious that it should not work. My mental model for refinements is that it shouldn't be different from reopening the class directly, or including a module.

So, it fails my principle of least surprise as is.

I understand the complexity angle tho.

----------------------------------------
Feature #13129: Refinements cannot refine method_missing and respond_to_missing?
https://bugs.ruby-lang.org/issues/13129#change-92753

* Author: matsuda (Akira Matsuda)
* Status: Assigned
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
----------------------------------------
Refinements with method_missing and respond_to_missing? behaves very strangely.

```ruby
class C; end

using Module.new {
  refine C do
    def x() p:x; end

    def method_missing(m, *args)
      m == :foo ? p(:fooo!) : super
    end

    def respond_to_missing?(m, include_private = false)
      (m == :foo) || super
    end
  end
}

C.new.x
p C.new.respond_to? :foo
C.new.foo
```

The script above doesn't respond_to :foo nor run :foo as expected.
Actually, the result differs between ruby versions.

```
% ruby -v t.rb
ruby 2.5.0dev (2017-01-14 trunk 57328) [x86_64-darwin15]
:x
false
t.rb:19:in `<main>': undefined method `foo' for #<C:0x007f90ca0fb240> (NoMethodError)

% ruby -v t.rb
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin15]
:x
false
t.rb:19:in `<main>': undefined method `foo' for #<C:0x007f80ae097780> (NoMethodError)

% ruby -v t.rb
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15]
:x
false
t.rb:19:in `<main>': undefined method `foo' for #<C:0x007fd89c83b518> (NoMethodError)

% ruby -v t.rb
ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-darwin15]
:x
false
:fooo!

% ruby -v t.rb
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-darwin15.0]
:x
false
:fooo!

% ruby -v t.rb
ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-darwin15.6.0]
t.rb:4: warning: Refinements are experimental, and the behavior may change in future versions of Ruby!
:x
false
:fooo!
```

What I can tell is that method_missing was broken at somewhere in between 2.2 and 2.3, and respond_to_missing? has never worked correctly.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>