[ruby-core:71337] [Ruby trunk - Bug #11655] Can't refine Object.const_missing

From: 0x0dea+redmine@...
Date: 2015-11-04 14:11:23 UTC
List: ruby-core #71337
Issue #11655 has been updated by D.E. Akers.


Nobuyoshi Nakada wrote:
> It's a spec.
> Refinements targets only explicit invocations.

How does that square with the behavior observed below?

```ruby
using Module.new {
  refine Object do
    def method_missing(*)
      42
    end
  end
}

p foo # => 42
```

----------------------------------------
Bug #11655: Can't refine Object.const_missing
https://bugs.ruby-lang.org/issues/11655#change-54709

* Author: D.E. Akers
* Status: Rejected
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.3.0dev (2015-11-04 trunk 52451) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
```ruby
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?



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

In This Thread

Prev Next