Project

General

Profile

Actions

Feature #17314

closed

Provide a way to declare visibility of attributes defined by attr* methods in a single expression

Added by radarek (Radosław Bułat) 6 months ago. Updated 4 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:100763]

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 calling private
  • 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 return nil 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


Related issues

Related to Ruby master - Feature #6470: Make attr_accessor return the list of generated methodClosedmatz (Yukihiro Matsumoto)Actions
Actions

Also available in: Atom PDF