From: alxtskrnk@... Date: 2015-12-07T17:21:43+00:00 Subject: [ruby-core:71917] [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. Well, since it's an established pattern, one has to just accept it. It does seem unintuitive to me that method calls, which are dynamically bound to self, are actually operating on the currently open class ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-55323 * 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/