Bug #3406
closedattr_accessor creates a private writer method
Description
=begin
(Also, there is a warning that may be incorrect.)
$ cat t.rb
module M
private
def attr_accessor(*args); super; end
end
class C
extend M
attr_accessor :x
end
C.new.x = 1
$ ruby19 -v t.rb
ruby 1.9.2dev (2010-05-31) [x86_64-linux]
t.rb:3: warning: private attribute?
t.rb:11:in <main>': private method
x=' called for #<C:0x000000012e5670> (NoMethodError)
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
=begin
Hi,
At Tue, 8 Jun 2010 01:18:50 +0900,
Joel VanderWerf wrote in [ruby-core:30638]:
Bug #3406: attr_accessor creates a private writer method
$ ruby19 -v t.rb
ruby 1.9.2dev (2010-05-31) [x86_64-linux]
t.rb:3: warning: private attribute?
t.rb:11:in<main>': private method
x=' called for #<C:0x000000012e5670> (NoMethodError)
The cause is that executing cref is used, whereas class
definition cref should be used.
Doesn't seem to need the separate module.
Just a test case for the present.
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index c2084a2..8963b37 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -921,4 +921,17 @@ class TestModule < Test::Unit::TestCase
end
end
+
- def test_attr_inherited_visibility
- c = Class.new do
-
class << self
-
private
-
def attr_accessor(*); super; end
-
end
-
attr_accessor :x
- end.new
- bug3406 = '[ruby-core:30638]'
- assert_nothing_raised(bug3406) {c.x = 1}
- assert_equal(1, c.x, bug3406)
- end
end
--
Nobu Nakada
=end
Updated by mame (Yusuke Endoh) over 14 years ago
- Target version changed from 1.9.2 to 2.0.0
=begin
Hi,
I really doubt whether or not this is a bug. Very clumsy semantics is
required to "fix" this. At least, any change for this issue should not
be included in 1.9.2.
What we really need is a general way for users to define attr_accessor-
like method, I guess. IOW, we need a way to get a visibility of current
caller context and to define a method with the visibility.
--
Yusuke Endoh mame@tsg.ne.jp
=end
Updated by mrkn (Kenta Murata) about 14 years ago
- Assignee set to matz (Yukihiro Matsumoto)
=begin
=end
Updated by nobu (Nobuyoshi Nakada) about 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r29578.
Joel, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end