Project

General

Profile

Actions

Feature #13109

closed

`using` in refinements is required to be physically placed before the refined method call

Added by matsuda (Akira Matsuda) almost 5 years ago. Updated about 4 years ago.

Status:
Rejected
Priority:
Normal
Target version:
-
[ruby-core:78988]

Description

When using refinements in one file, the using call needs to be physically placed before the refined method call.

For example, this works:

using Module.new {
  refine Object do
    def foo() p 'hello'; end
  end
}

class Object
  def bar() foo; end
end

Object.new.bar

but this doesn't work:

class Object
  def bar() foo; end
end

using Module.new {
  refine Object do
    def foo() p 'hello'; end
  end
}

Object.new.bar

#=> doesnot_work.rb:2:in `bar': undefined local variable or method `foo' for #<Object:0x007f8f2a0251c8> (NameError)

I know that current refinements has a unique scope called "file scope", but I don't think this is expected behavior.
At least I expect it to work so far as using is evaluated in runtime, no matter where in the file it is.

I confirmed that this reproduces in all stable versions of 2.0, 2.1, 2.2, 2.3, 2.4, and today's trunk (2.5).


Related issues

Related to Ruby master - Feature #13805: Make refinement scoping to be like that of constantsOpenActions
Actions

Also available in: Atom PDF