Issue #13109 has been updated by razum2um (Vlad Bokov).


matz (Yukihiro Matsumoto) wrote:
> There may be an idea to use refinement without explicit `using`. But that's out of the scope of this issue.
> 
> Matz.

Very interesting, @Matz, please, could you refer to the issue of non-explicit `using`?

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

* Author: matsuda (Akira Matsuda)
* Status: Rejected
* Priority: Normal
* Assignee: shugo (Shugo Maeda)
* Target version: 
----------------------------------------
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>