mirror of
https://github.com/ruby/ruby.git
synced 2025-09-23 12:33:56 +02:00
Make attr* methods define public methods if self in caller is not same as receiver
Previously, attr* methods could be private even if not in the
private section of a class/module block.
This uses the same approach that ruby started using for define_method
in 1fc3319973
.
Fixes [Bug #4537]
This commit is contained in:
parent
b8e351a1b9
commit
ef45a57801
3 changed files with 30 additions and 2 deletions
|
@ -705,6 +705,32 @@ class TestModule < Test::Unit::TestCase
|
|||
assert_equal(false, o.respond_to?(:bar=))
|
||||
end
|
||||
|
||||
def test_attr_public_at_toplevel
|
||||
s = Object.new
|
||||
TOPLEVEL_BINDING.eval(<<-END).call(s.singleton_class)
|
||||
proc do |c|
|
||||
c.send(:attr_accessor, :x)
|
||||
c.send(:attr, :y)
|
||||
c.send(:attr_reader, :z)
|
||||
c.send(:attr_writer, :w)
|
||||
end
|
||||
END
|
||||
assert_nil s.x
|
||||
s.x = 1
|
||||
assert_equal 1, s.x
|
||||
|
||||
assert_nil s.y
|
||||
s.instance_variable_set(:@y, 2)
|
||||
assert_equal 2, s.y
|
||||
|
||||
assert_nil s.z
|
||||
s.instance_variable_set(:@z, 3)
|
||||
assert_equal 3, s.z
|
||||
|
||||
s.w = 4
|
||||
assert_equal 4, s.instance_variable_get(:@w)
|
||||
end
|
||||
|
||||
def test_const_get_evaled
|
||||
c1 = Class.new
|
||||
c2 = Class.new(c1)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue