Actions
Misc #22192
closedClarify the scope of default visibility changed inside a block
Misc #22192:
Clarify the scope of default visibility changed inside a block
Status:
Closed
Assignee:
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