From: eregontp@... Date: 2021-06-17T09:59:00+00:00 Subject: [ruby-core:104339] [Ruby master Bug#11779] Module#using does not make sense as a method Issue #11779 has been updated by Eregon (Benoit Daloze). `Module#using` has a granularity of "constant lexical scope", i.e., a scope that is only changed by `module` or `class` keywords. Maybe the docs should be improved in this regard? Current docs say this ``` Import class refinements from module into the current class or module definition. ``` which seem fair enough but could be more precise (i.e., only for `module` or `class` keywords, not for module_eval/module_exec/etc). ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-92562 * Author: bughit (bug hit) * Status: Feedback * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) * 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/ Unsubscribe: