From: shugo@... Date: 2017-01-22T02:57:25+00:00 Subject: [ruby-core:79212] [Ruby trunk Bug#13129] Refinements cannot refine method_missing and respond_to_missing? Issue #13129 has been updated by Shugo Maeda. Assignee changed from Shugo Maeda to Yukihiro Matsumoto Akira Matsuda wrote: > 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. I think the behavior of 2.3 or later is expected because *_missing are indirect method calls. Matz, what do you think of changing the behavior? ---------------------------------------- Bug #13129: Refinements cannot refine method_missing and respond_to_missing? https://bugs.ruby-lang.org/issues/13129#change-62632 * Author: Akira Matsuda * Status: Assigned * Priority: Normal * Assignee: Yukihiro Matsumoto * 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 `
': undefined method `foo' for # (NoMethodError) % ruby -v t.rb ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin15] :x false t.rb:19:in `
': undefined method `foo' for # (NoMethodError) % ruby -v t.rb ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15] :x false t.rb:19:in `
': undefined method `foo' for # (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: