Issue #11779 has been updated by bug hit.


bug hit wrote:
> bug hit wrote:
> > Nobuyoshi Nakada wrote:
> > > It is not a noop, just you don't use the refined method there.
> > 
> > Where "there"?  Where should I use the refined method to see the effect of that using call?
> 
> ok got it, thanks
> 
> ```ruby
> module Refinement
>   refine String do
>     def refined?
>       true
>     end
>   end
> end
> 
> module Foo
>   def self.refined?
>     ''.refined? rescue false
>   end
> end
> 
> Foo.module_eval do
>   using Refinement
>   p((''.refined? rescue false)) #true
> end
> ```

so if `using` inside module_eval is intended to work then invoking such a module_eval from a method should also work (it raises Module#using is not permitted in methods):

```Ruby
module Refinement
  refine String do
    def refined?
      true
    end
  end
end

module Foo
  def self.refined?
    ''.refined? rescue false
  end

  def self.foo
    module_eval do
      using Refinement # Module#using is not permitted in methods
      p((''.refined? rescue false))
    end
  end

  foo
end
```

----------------------------------------
Bug #11779: Module#using does not make sense as a method
https://bugs.ruby-lang.org/issues/11779#change-55377

* Author: bug hit
* Status: Feedback
* Priority: Normal
* Assignee: 
* ruby -v: 2.2.3
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
1. it can't be called from another method
2. the receiver must be self
3. since refinements are lexically scoped the self receiver must match the currently open class

#3 is particularly curious

```ruby
module Refinement
  refine String do
    def refined?
      true
    end
  end
end

module Foo
  def self.refined?
    ''.refined? rescue false
  end
end


module Bar
  def self.refined?
    ''.refined? rescue false
  end
  Foo.module_eval do
    using Refinement

  end
end

p Foo.refined? #false
```

The module_eval `#using` call does not raise (it's not from a method and the receiver is self), but evidently because currently open class does not match self, it does not do anything. So it should at least raise.

So `#using`, though a method, does not function as a method, which is misleading.



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