Accessor methods for class methods

It seems odd that cattr_* (i.e. cattr_accessor, cattr_reader,
cattr_writer) is not in the native Ruby and that you have to require
active support and rubygems to get this to work. Including the rails
stuff appears to slow things down a little. Why is this not built in the
native Ruby source?

El Viernes, 5 de Septiembre de 2008, Jason L. escribió:

It seems odd that cattr_* (i.e. cattr_accessor, cattr_reader,
cattr_writer) is not in the native Ruby and that you have to require
active support and rubygems to get this to work. Including the rails
stuff appears to slow things down a little. Why is this not built in the
native Ruby source?

Note that you can do the same using:


class MyClass

class << self
attr_accessor :class_attribute_1, :class_attribute_2
end

end

So you can use it:

Hi –

On Sat, 6 Sep 2008, Jason L. wrote:

It seems odd that cattr_* (i.e. cattr_accessor, cattr_reader,
cattr_writer) is not in the native Ruby and that you have to require
active support and rubygems to get this to work. Including the rails
stuff appears to slow things down a little. Why is this not built in the
native Ruby source?

I can’t answer that directly, but I can tell you why I’m glad it
isn’t. It’s partly that class variables are a bit oddball to start
with, and I’m not eager to see them used a lot more. But it’s also the
terminology.

An “attribute” is, or should be, an attribute of an object. But class
variables are not object-specific; they’re very promiscuous, visible
to a class, its instances, and all the subclasses and all their
instances.

Therefore, a class variable is not an appropriate choice for
representing an “attribute”. The fit between instance variables, as a
language-level construct, and “attribute”, as a concept, is very good;
but class variables are very different from instance variables, and
the “attr” terminology is very loose. (The methods may have uses, but
the names are problematic.)

David

It seems odd that cattr_* (i.e. cattr_accessor, cattr_reader,
cattr_writer) is not in the native Ruby

I can not answer this but personally I have stopped using class
variables after

  • i had a smallish bug which was caused by a stupid usage I did long ago
    of a class variable
  • there really is not a huge need to use a class var in the first place
    (in my opinion and experience).

So personally, for me, I have found that I can live perfectly happy
without class vars, and in these times, whenever I can achieve the same
with a very simple easy route, I use it. There may be a few valid use
cases for a class var but I honestly have never seen them as being very
important.

Thanks. That makes sense. I want to do what is simplest, but it seems
without cattr things would get worse. Here is what I’m trying to do:

I have one rb file used for inputs:

require ‘rubygems’
require ‘activesupport’
class Input
cattr_reader :y
def self.y
@y = 2
end
end

**except I have lots of vars instead of just :y and I’m assigning them
values here.

Then I go to a new rb file and do this:

require ‘firstfile.rb’
class NewClass
def do_something
Input.y * 2.3
end
end

new = NewClass.new
p new.do_something

**The fact that I need to say “Input.y” seems very bulky. Is there a
better way to do this? Plus, if I get away from class vars, it will get
bulkier. any ideas?

HI –

On Sat, 6 Sep 2008, Jason L. wrote:

def self.y
class NewClass
bulkier. any ideas?
You’re not actually using any class variables in your example. If you
delete the cattr_reader line, the code still runs. You’re writing a
“reader” method (Input.y) by hand, and it’s using an instance
variable, not a class variable (an instance variable belonging to the
class Input itself).

David