Feature #8635

attr_accessor with default block

Added by Magnus Holm 9 months ago. Updated 9 months ago.

[ruby-core:56001]
Status:Open
Priority:Normal
Assignee:-
Category:-
Target version:-

Description

=begin

It's quite common to define attributes (like attrreader, attraccessor) with default values. It would be useful if Ruby provided a helper method for this case. attraccessor and attrreader can support this nicely using a default block:

class Person
# (1) Simple approach
attr_writer :name
def name
@name ||= 'Hello'
end

# (2) nil-safe approach
attr_writer :name
def name
return @name if defined? @name
@name = 'Hello'
end

# (3) This proposal
attr_accessor :name do
'Hello'
end
end

p = Person.new
p.instancevariableget(:@name) # => nil
p.name # => 'Hello'
p.instancevariableget(:@name) # => 'Hello'

Problems with current approaches:

  • The reader and the writer looks widely different
  • Solution 1 doesn't work as intended when the default value may evaulate to nil/false
  • Solution 2 requires you to write the attribute name five times

=end

History

#1 Updated by Konstantin Haase 9 months ago

If this should be added, could you consider adding it with a read-write-lock?

#2 Updated by Magnus Holm 9 months ago

On Mon, Jul 15, 2013 at 6:07 PM, rkh (Konstantin Haase) me@rkh.im wrote:

Issue #8635 has been updated by rkh (Konstantin Haase).

If this should be added, could you consider adding it with a
read-write-lock?

What do you mean?

Is it for thread-safety? In that case: I disagree. Concurrent classes needs
to be specifically designed, and I don't want to add any overhead to
attr_accessor.

Or is it for detecting recursive calls in the same thread?

#3 Updated by Avdi Grimm 9 months ago

Just adding some prior art...

There have been many, many takes on this in various gems, but I thought I'd drop in a note about https://github.com/ahoward/fattr, which is my personal favorite and a gem I've used happily for many years. It might provide some implementation inspiration.

#4 Updated by Ilya Vorontsov 9 months ago

May be thread-safety should be optional. But it definitely should be.

Also available in: Atom PDF