Issue #22192 has been updated by shugo (Shugo Maeda). Status changed from Assigned to Closed Eregon (Benoit Daloze) wrote in #note-3:
TruffleRuby also behaves like CRuby here. My understanding is method visibility is some state that only exists in methods and not in blocks (same as `$~`, etc).
There should already be some ruby/spec for that.
Thank you, I've found the following spec in spec/ruby/core/module/shared/set_visibility.rb: ```ruby it "sets the visibility outside the closure" do visibility = @method mod = Module.new { 1.times { send visibility } def test1() end } mod.send(:"#{@method}_instance_methods", false).should.include?(:test1) end ``` JRuby is aware of the incompatibility: it tags this spec as failing for Module#private and Module#protected. So' I'm closing this issue. ---------------------------------------- Misc #22192: Clarify the scope of default visibility changed inside a block https://bugs.ruby-lang.org/issues/22192#change-118080 * Author: shugo (Shugo Maeda) * Status: Closed * Assignee: matz (Yukihiro Matsumoto) ---------------------------------------- `private` etc. called with no arguments inside a block changes the default visibility of the enclosing lexical scope, and the change survives the block: ```ruby 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: ```ruby 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. -- https://bugs.ruby-lang.org/