Issue #13129 has been reported by Akira Matsuda.

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

* Author: Akira Matsuda
* Status: Open
* Priority: Normal
* Assignee: Shugo Maeda
* Target version: 2.5
* ruby -v: ruby 2.5.0dev (2017-01-14 trunk 57328) [x86_64-darwin15]
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
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>