Actions
Bug #11655
closedCan't refine Object.const_missing
Bug #11655: Can't refine Object.const_missing
Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.3.0dev (2015-11-04 trunk 52451) [x86_64-linux]
Description
TracePoint.new(:c_call) { |tp| if tp.method_id == :const_missing puts "top-level const_missing is #{tp.self}'s" end }.enable { Foo rescue 1 } # => top-level const_missing is Object's module M refine Object.singleton_class do def const_missing c 'Explicit invocation works.' end def new 'Can refine other singleton methods.' end end end using M puts Object.const_missing :Foo # => Explicit invocation works. Foo rescue p $! # => #<NameError: uninitialized constant Foo> def Object.const_missing c 'So does direct definition.' end puts Foo # => So does direct definition. puts Object.new # => Can refine other singleton methods. Is it a bug?
Updated by nobu (Nobuyoshi Nakada) about 10 years ago
- Status changed from Open to Rejected
It's a spec.
Refinements targets only explicit invocations.
Updated by 0x0dea (D.E. Akers) about 10 years ago
Nobuyoshi Nakada wrote:
It's a spec.
Refinements targets only explicit invocations.
How does that square with the behavior observed below?
using Module.new { refine Object do def method_missing(*) 42 end end } p foo # => 42
Updated by 0x0dea (D.E. Akers) about 10 years ago
Nobu? Given the behavior observed above, I must maintain that this is a bug worth reopening. If I am mistaken in that conclusion, could you please take a moment to clarify your assertion that the Refinements spec prohibits implicit invocation? Thank you in advance for your time and patience.
Updated by ktsj (Kazuki Tsujimoto) almost 10 years ago
- Related to Bug #11809: method_missing should not be refined added
Actions