Project

General

Profile

Actions

Misc #22192

closed

Clarify the scope of default visibility changed inside a block

Misc #22192: Clarify the scope of default visibility changed inside a block

Added by shugo (Shugo Maeda) 7 days ago. Updated 7 days ago.


Description

private etc. called with no arguments inside a block changes the default visibility of the enclosing lexical scope, and the change survives the block:

class C
  %i[foo bar].each do |name|
    private
    define_method(name) { }
  end
  def afterwards; end   # also private
end
C.private_method_defined?(:foo)        #=> true
C.private_method_defined?(:afterwards) #=> true

When multiple Procs share the same lexical scope, private in a Proc affects all Procs:

class Host
  SET_PRIVATE = proc { private }
  DEFINE      = proc { def probe; end }
end
Host::SET_PRIVATE.call
Host::DEFINE.call
Host.private_method_defined?(:probe)   #=> true

Neither CRuby nor ruby/spec has corresponding tests. I assume this is intentional, but am I correct?
It seems that the visibility change is effective only within the block on JRuby, so I'd like to clarify this.

Actions

Also available in: PDF Atom