Issue #13109 has been reported by Akira Matsuda.

----------------------------------------
Bug #13109: `using` in refinements is required to be physically placed before the refined method call
https://bugs.ruby-lang.org/issues/13109

* Author: Akira Matsuda
* Status: Open
* Priority: Normal
* Assignee: Shugo Maeda
* Target version: 
* ruby -v: ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin15]
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
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).



-- 
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>