Is using attr_accessor for class variables possible?

I know that attr_accessor works for accessing instance variables, but it doesn't seem to work for class ones. What is the best way to set/retrieve the value of a class variable?

Many thanks

Gabriel

Hi --

I know that attr_accessor works for accessing instance variables, but it doesn't seem to work for class ones. What is the best way to set/retrieve the value of a class variable?

@@var = 1
@@var

:slight_smile:

If you want to wrap them in methods:

   class C
     def C.var
       @@var
     end

     def C.var=(x)
       @@var = x
     end
   end

In Rails, there's a thing called "cattr" that does this automatically:

   class C
     cattr_acccessor :var
   end

It's a little misleading, though. The term "attribute" (or attr)
refers to an attribute or property of an object. Class variables are
very promiscuous: they're shared among many objects (a class, its
descendants, all instances of all of those classes), so a class
variable is not really the right choice for an "attribute", and "attr"
is not the best name for wrappers around class variables.

If you want to represent state per class, the best way is to give your
class an instance variable or accessor:

   class C
     class << self # C's singleton class
       attr_accessor :var
     end
   end

David

···

On Sun, 7 Oct 2007, Gabriel Dragffy wrote:

--
Upcoming training from Ruby Power and Light, LLC:
   * Intro to Ruby on Rails, Edison, NJ, October 23-26
   * Advancing with Rails, Edison, NJ, November 6-9
Both taught by David A. Black.
See http://www.rubypal.com for more info!

Hi --

I know that attr_accessor works for accessing instance variables, but it doesn't seem to work for class ones. What is the best way to set/retrieve the value of a class variable?

@@var = 1
@@var

Good point, I mean access the class variable from outside the class (above the class).

:slight_smile:

If you want to wrap them in methods:

  class C
    def C.var
      @@var
    end

    def C.var=(x)
      @@var = x
    end
  end

I was wondering if I should do this. I just remember attr_accessor was a short cut for this, but only for instance variables.

In Rails, there's a thing called "cattr" that does this automatically:

  class C
    cattr_acccessor :var
  end

It's a little misleading, though. The term "attribute" (or attr)
refers to an attribute or property of an object. Class variables are
very promiscuous: they're shared among many objects (a class, its
descendants, all instances of all of those classes), so a class
variable is not really the right choice for an "attribute", and "attr"
is not the best name for wrappers around class variables.

If you want to represent state per class, the best way is to give your
class an instance variable or accessor:

  class C
    class << self # C's singleton class
      attr_accessor :var
    end
  end

I read about singletons in Pragmatic Programming, not entirely sure how to make use of it though

Thank you very much for your advice.

Regards

Gabe

···

On 7 Oct 2007, at 13:39, David A. Black wrote:

On Sun, 7 Oct 2007, Gabriel Dragffy wrote:

Hi,

···

Am Sonntag, 07. Okt 2007, 21:39:24 +0900 schrieb David A. Black:

If you want to represent state per class, the best way is to give your
class an instance variable or accessor:

  class C
    class << self # C's singleton class
      attr_accessor :var
    end
  end

I do this all the time. But:

  class D < C ; end

Always keep in mind that `D.var' will be something different
than `C.var'.

Bertram

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de

Hi --

···

On Sun, 7 Oct 2007, Bertram Scharpf wrote:

Hi,

Am Sonntag, 07. Okt 2007, 21:39:24 +0900 schrieb David A. Black:

If you want to represent state per class, the best way is to give your
class an instance variable or accessor:

  class C
    class << self # C's singleton class
      attr_accessor :var
    end
  end

I do this all the time. But:

class D < C ; end

Always keep in mind that `D.var' will be something different
than `C.var'.

That's the point of attr_accessor: to give easy access to per-object
state.

David

--
Upcoming training from Ruby Power and Light, LLC:
   * Intro to Ruby on Rails, Edison, NJ, October 23-26
   * Advancing with Rails, Edison, NJ, November 6-9
Both taught by David A. Black.
See http://www.rubypal.com for more info!

Hi,

If you want to represent state per class, the best way is to give your
class an instance variable or accessor:

  class C
    class << self # C's singleton class
      attr_accessor :var
    end
  end

I do this all the time. But:

class D < C ; end

Always keep in mind that `D.var' will be something different
than `C.var'.

That's the point of attr_accessor: to give easy access to per-object
state.

About a month ago I found myself doing even this:

  class C
    @x = "x-default"
    class <<self
      def x ; @x or superclass.x ; end
    end
  end

  class D < C ; end
  class E < D ; @x = "x-special" ; end

  puts C.x
  puts D.x
  puts E.x

I still don't know what is better: using stable instance
methods (same value on every call) or doing it this way.

Bertram

···

Am Sonntag, 07. Okt 2007, 22:56:54 +0900 schrieb David A. Black:

On Sun, 7 Oct 2007, Bertram Scharpf wrote:

Am Sonntag, 07. Okt 2007, 21:39:24 +0900 schrieb David A. Black:

--
Bertram Scharpf
Stuttgart, Deutschland/Germany
http://www.bertram-scharpf.de