Project

General

Profile

Actions

Feature #11541

closed

Let attr_accessor, _reader & _writer return symbols of the defined methods

Added by iGEL (Johannes Barre) over 8 years ago. Updated about 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:<unknown>]

Description

Since Ruby 2.1, def returns a symbol with the name of the just defined method, so you can easily pass it to visibility modifiers like private, protected, and public. Why not let attr_reader & friends return an array with the names of the defined methods, so we can easily write:

private attr_reader :method1, :method2

To fully support the example above, private would be required to accept also arrays with method names. Without it, it would require the star syntax, which would already be an improvement:

private *attr_reader :method1, :method2

I wrote two test cases to better illustrate the impact:

test/ruby/test_module.rb:

  def test_attr_return_value
    c = Class.new

    assert_equal(%i(reader1 reader2), c.class_eval { attr_reader(:reader1, :reader2) })
    assert_equal(%i(writer1= writer2=), c.class_eval { attr_writer(:writer1, :writer2) })
    assert_equal(%i(accessor1 accessor1= accessor2 accessor2=), c.class_eval { attr_accessor(:accessor1, :accessor2) })
  end

test/ruby/test_method.rb:

  def test_visibility_modifier_with_array
    c = Class.new do
      def m1; end
      def m2; end
    end

    c.class_eval { private %i(m1 m2) }
    assert(c.private_method_defined?(:m1))
    assert(c.private_method_defined?(:m2))

    c.class_eval { protected %w(m1 m2) }
    assert(c.protected_method_defined?(:m1))
    assert(c.protected_method_defined?(:m2))

    c.class_eval { public :m1, [:m2] } # Not sure if this should be allowed.
    assert(c.public_method_defined?(:m1))
    assert(c.public_method_defined?(:m2))

    assert_raise(NameError) do
      c.class_eval { private %i(m1 m2 m3) }
    end
    assert(c.private_method_defined?(:m1))
    assert(c.private_method_defined?(:m2))

    assert_raise(TypeError) do
      c.class_eval { protected [:m1, 2] }
    end
    assert(c.private_method_defined?(:m1))

    assert_raise(TypeError) do
      c.class_eval { public [:m1, [:m2]] } # Not sure about this case. Should it be allowed?
    end
    assert(c.public_method_defined?(:m1))
  end

WDYT? Thank you!


Related issues 5 (2 open3 closed)

Related to Ruby master - Feature #12019: Better low-level support for writing concurrent librariesOpenmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #14397: public, protected and private should return their arguments instead of selfAssignedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #6470: Make attr_accessor return the list of generated methodClosedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #9453: Return symbols of defined methods for `attr` and friendsRejectedmatz (Yukihiro Matsumoto)Actions
Related to Ruby master - Feature #13560: Module#attr_ methods return reasonable valuesClosedActions

Updated by pitr.ch (Petr Chalupa) about 8 years ago

+1, this is also very useful for low level concurrency proposals. It allows to write public attr :status, atomic: true where attr returns array of 4 defined atomic helper methods. The array is accepted by public method which modifies the visibility of the helpers.

Actions #2

Updated by Eregon (Benoit Daloze) about 8 years ago

  • Related to Feature #12019: Better low-level support for writing concurrent libraries added
Actions #3

Updated by Eregon (Benoit Daloze) about 6 years ago

  • Related to Feature #14397: public, protected and private should return their arguments instead of self added

Updated by gfx (Goro FUJI) about 6 years ago

+1

I'm about to issue the same feature request😆

Updated by shevegen (Robert A. Heiler) over 5 years ago

I don't have a big pro or con opinion (am neutral here), but perhaps we could move this
to an upcoming developer meeting anyway?

Actions #6

Updated by Eregon (Benoit Daloze) about 5 years ago

  • Related to Feature #6470: Make attr_accessor return the list of generated method added
Actions #7

Updated by znz (Kazuhiro NISHIYAMA) over 4 years ago

  • Related to Feature #9453: Return symbols of defined methods for `attr` and friends added
Actions #8

Updated by znz (Kazuhiro NISHIYAMA) over 4 years ago

  • Related to Feature #13560: Module#attr_ methods return reasonable values added

Updated by marcandre (Marc-Andre Lafortune) almost 3 years ago

  • Status changed from Open to Closed

Shipped in Ruby 3.0

Actions #10

Updated by hsbt (Hiroshi SHIBATA) about 2 years ago

  • Project changed from 14 to Ruby master
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0