Issue #13560 has been updated by dunrix (Damon Unrix).


> What would perhaps be nice would be to have a way to initialize these to nil, upon
attr_* definition

Why nice ? This is definitely a purpose of `initialize` method. Belongs to object initialization, not class definition. In addition, there is no general rule for nil as a default value.

>  do not know whether it makes anything more prone to errors.

If you rename an attribute, you shouldn't forget change an argument name passed to visibility method call. Suggested feature allows single point of change.


----------------------------------------
Feature #13560: Module#attr_ methods return reasonable values
https://bugs.ruby-lang.org/issues/13560#change-65131

* Author: dunrix (Damon Unrix)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Hi,

I'm suggesting all `Module#attr_` [methods](http://ruby-doc.org/core-2.4.1/Module.html#method-i-attr_accessor) should return array of generated method names, instead of useless `nil`.
Make them more concise across `Module` API, corresponding to logic of [`Module#define_method`](http://ruby-doc.org/core-2.4.1/Module.html#method-i-define_method), allow pass as arguments to visibility `public/protected/private` methods etc.

Concerned method names:

* attr_accessor
* attr_reader
* attr_writer

Demonstration example:

```
class LookBeforeYouLeap
  api_meths = attr_accessor :ruby_api
  # api_meths == [:ruby_api, :ruby_api=]
  private *api_meths

  # Or you can pass generated methods directly
  # protected *attr_reader(:ruby_papi, :ruby_cext)
end

# Assignment to temporary local variable `api_meths` does not pollute class'es
# namespace.
```

I'm aware *attr_** methods also create corresponding instance variables, but `Module` API has no use for them, unlike created accessor methods.

In current state, where *attr_** methods return `nil`, it makes class definition more prone to errors, especially at code refactoring:

```
class ExistingWay
  attr_accessor :ruby_api  # result is nil

  # Need write method names manually
  private :ruby_api, :rby_api=  # throws NameError exception when executed

  # Any change of generated accessor methods names require manual rewrite
  # at each visibility method call also.
end
```




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>