Actions
Feature #17314
closedProvide a way to declare visibility of attributes defined by attr* methods in a single expression
Status:
Closed
Assignee:
-
Target version:
-
Description
Description
Many of us (me included) declare class attributes, even if they are private, on the top of class definition. When reading source code it's convinient to see what kind of attributes class has.
To declare private attributes we can:
- declare them with one of
attr*
methods and later change visiblity callingprivate
- call
private
without argument, then declare attributes and finally call (in most cases)public
to keep defining public methods - declare attribute on top of the class but make them private in private section later in a file
clsss Foo
attr_accessor :foo
private :foo, :foo= # we have to remember about :foo= too
private
attr_accessor :bar
public
# rest of the code
end
To simplify it and create other possibilites I propose to:
- change
attr*
methods so as they return array of defined methods names - allow
public/protected/private
methods to receive array of methods names (single argument)
With requested feature we could write code like this:
class Foo
private attr_accessor :foo, :bar
end
Additionaly you could use attr*
with your own methods. Something like this:
class Module
def traceable(names)
# ...
names
end
end
class Foo
traceable attr_accessor :foo
# it can be mixed with public/protected/private too
protected traceable attr_accessor :bar
end
Backward compatibility
-
attr*
methods currently returnnil
so there should be no problem with changing them -
public/protected/private
methods receive multiple positional arguments and convert all non symbol/string objects to strings. I can imagine only one case where compatibility would be broken:
class Foo
def foo; end
def bar; end
arr = [:foo]
def arr.to_str
'bar'
end
private arr
end
p [Foo.public_instance_methods(false), Foo.private_instance_methods(false)]
Currently [[:foo], [:bar]]
would be displayed, [[:bar], [:foo]]
after requested feature is implemented.
Implementation
You can view my implementation in this (draft) PR: https://github.com/ruby/ruby/pull/3757
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0