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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>