Actions
Bug #21196
closedRuby 3.4 ignores visibility when passing arguments using `...`
Description
If method is passing arguments using ...
, then receiver visibility gets ignored if once called without receiver:
class A
private
def foo = :foo
def bar = :bar
end
class B
def initialize(o)
@o = o
end
def foo(...) = @o.foo(...)
def bar = @o.bar
def internal_foo = foo
def internal_bar = bar
end
def try
p yield
rescue => e
p e
end
If foo
is called first without receiver through internal_foo
:
b = B.new(A.new)
try{ b.internal_foo }
try{ b.internal_bar }
try{ b.foo }
try{ b.bar }
Visibility of A#foo
gets ignored:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
:foo
#<NoMethodError: private method 'bar' called for an instance of A>
:foo
#<NoMethodError: private method 'bar' called for an instance of A>
ruby 3.3.7 (2025-01-15 revision be31f993d7) [x86_64-linux]
#<NoMethodError: private method `foo' called for an instance of A>
#<NoMethodError: private method `bar' called for an instance of A>
#<NoMethodError: private method `foo' called for an instance of A>
#<NoMethodError: private method `bar' called for an instance of A>
If internal_foo
is not called before foo
:
b = B.new(A.new)
try{ b.foo }
try{ b.bar }
Visibility of A#foo
gets checked:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
#<NoMethodError: private method 'foo' called for an instance of A>
#<NoMethodError: private method 'bar' called for an instance of A>
ruby 3.3.7 (2025-01-15 revision be31f993d7) [x86_64-linux]
#<NoMethodError: private method `foo' called for an instance of A>
#<NoMethodError: private method `bar' called for an instance of A>
Actions
Like1
Like0Like0Like1Like0Like0Like0