From: alxtskrnk@... Date: 2017-07-08T03:28:50+00:00 Subject: [ruby-core:81967] [Ruby trunk Bug#11779] Module#using does not make sense as a method Issue #11779 has been updated by bughit (bug hit). nobu (Nobuyoshi Nakada) wrote: > Seems that your "dynamic" and "lexical" words differ from ours. I was using "dynamic" to mean that its dynamically "bound" (applies) to the default definee at the point of invocation, not the lexically determined currently open class. It's true that the receiver does not matter at all (I initially thought it had to self): ```ruby module Mod1 class Class1 end def self.lookup_class Class1 end lookup_class.class_eval do def foo1 self end Module.new.send(:private) def foo2 self end end c1 = Class1.new c1.foo1.foo2 rescue puts $!.inspect end ``` Please clarify how you're using dynamic vs lexical? ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-65691 * Author: bughit (bug hit) * Status: Feedback * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) * Target version: * 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: