From: alxtskrnk@... Date: 2017-07-07T17:07:33+00:00 Subject: [ruby-core:81960] [Ruby trunk Bug#11779] Module#using does not make sense as a method Issue #11779 has been updated by bughit (bug hit). matz (Yukihiro Matsumoto) wrote: > Providing a feature by a method does not imply dynamic scoping, for example, Module#private etc. work in lexical scope. I didn't think about Module#private too deeply at the time, but recently was prompted by something, and Module#private is not lexical ```ruby module Mod1 class Class1 end def self.lookup_class Class1 end lookup_class.class_eval do def foo1 self end private def foo2 self end end lookup_class.instance_eval do define_method :bar1 do self end def bar1 self end private def bar2 self end define_method :bar2 do self end end c1 = Class1.new c1.foo1.foo2 rescue puts $!.inspect Class1.bar1.bar2 rescue puts $!.inspect c1.bar1.bar2 rescue puts $!.inspect end ``` it affects the dynamically scoped default definee, which though dynamic does not necessarily match the receiver. ---------------------------------------- Bug #11779: Module#using does not make sense as a method https://bugs.ruby-lang.org/issues/11779#change-65683 * 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: