From: alxtskrnk@... Date: 2015-12-07T17:43:29+00:00 Subject: [ruby-core:71918] [Ruby trunk - Bug #11779] Module#using does not make sense as a method Issue #11779 has been updated by bug hit. Yukihiro Matsumoto wrote: > Providing a feature by a method does not imply dynamic scoping, for example, Module#private etc. work in lexical scope. > > Matz. actually `private` is more dynamic than `using`, here's an example of private working not on the currently open class but on the dynamically bound default definee: ```ruby Class1.class_eval do private def meth1 end end Class1.new.meth1 # private method `meth1' called ``` whereas using is not affected by `self` or "default definee" ```ruby module Refinement refine String do def refined? true end end end module Foo #using Refinement def self.refined? ''.refined? rescue false end end Foo.module_eval do using Refinement p refined? # false end p Foo.refined? #false ``` Is the above behavior correct? Instead of doing nothing, should this use of `using` produce an error or perhaps work inside the `module_eval` block ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-55324 * 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/