From: alxtskrnk@... Date: 2015-12-09T05:40:14+00:00 Subject: [ruby-core:71981] [Ruby trunk - Bug #11779] Module#using does not make sense as a method Issue #11779 has been updated by bug hit. Shugo Maeda wrote: > bug hit wrote: > > Shugo Maeda wrote: > > > bug hit wrote: > > > > 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): > > > > > > Module#using is not intented to work as you expect. > > > > > > > This wasn't really my expectation, it was nobu's explanation (It is not a noop, just you don't use the refined method there), which I confirmed. > > > > "using" called from a module_eval block activates the refinement in the block > > > > Are you saying that's a bug? > > Nobu didn't explain that Module#using should work in methods. > Module#using is designed not for such dynamic use. Note that when #using is called in a module eval_block, it's effect is confined to the body of the block. So why should it matter if module_eval is called from a method or top level or from another module/class? Regardless of where it's called, #using inside it works the same. ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-55389 * 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/