Project

General

Profile

Actions

Feature #8635

open

attr_accessor with default block

Added by judofyr (Magnus Holm) almost 11 years ago. Updated over 2 years ago.

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

Description

=begin

It's quite common to define attributes (like attr_reader, attr_accessor) with default values. It would be useful if Ruby provided a helper method for this case. attr_accessor and attr_reader 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.instance_variable_get(:@name) # => nil
p.name # => 'Hello'
p.instance_variable_get(:@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

Updated by rkh (Konstantin Haase) almost 11 years ago

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

Updated by judofyr (Magnus Holm) almost 11 years ago

On Mon, Jul 15, 2013 at 6:07 PM, rkh (Konstantin Haase) 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?

Updated by avdi (Avdi Grimm) almost 11 years 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.

Updated by prijutme4ty (Ilya Vorontsov) almost 11 years ago

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

Actions #5

Updated by hsbt (Hiroshi SHIBATA) over 2 years ago

  • Project changed from 14 to Ruby master
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0