I have a related question - a similar problem to the one just given,
but that solution doesn't fit here because I don't just want the class
name - I want an attribute associated with the class, which subclasses
can override.
I've tried doing this using class variables, but it doesn't work:
···
--
class Animal
@@sound = "nothing"
def to_s
"I say " + @@sound
end
end
class Cat < Animal
@@sound = "miaow"
end
class Dog < Animal
@@sound = "woof"
end
fudge = Cat.new()
puts fudge
tip = Dog.new()
puts tip
--
This is an abstraction of my real situation but it captures the
essense: each subclass has some attribute which needs to be
manipulated at some point; the code to manipulate the attribute is
common across all subclasses, so it should live in the superclass.
(In fact, ideally, Animal is "abstract" and I don't want to declare a
@@sound there at all - but if I do that, to_s complains about
"uninitialized class variable".)
Alas:
[gimbo@lotus learn] ruby -v subclass_names.rb
ruby 1.8.4 (2005-12-24) [i386-freebsd6]
subclass_names.rb:9: warning: already initialized class variable @@sound
subclass_names.rb:13: warning: already initialized class variable @@sound
I say woof
I say woof
So I guess I'm misusing class variables.
I also tried it with constants (which would be even better since the
value won't ever change) but got "I say nothing" twice instead.
If anyone can help me understand what's going on and how this _should_
be done, I'd be grateful. I'm still thinking in python a bit too
much, I think.
I have a related question - a similar problem to the one just given,
but that solution doesn't fit here because I don't just want the class
name - I want an attribute associated with the class, which subclasses
can override.
I've tried doing this using class variables, but it doesn't work:
--
class Animal
@@sound = "nothing"
def to_s
"I say " + @@sound
end
end
class Cat < Animal
@@sound = "miaow"
end
class Dog < Animal
@@sound = "woof"
end
fudge = Cat.new()
puts fudge
tip = Dog.new()
puts tip
--
class Animal @sound = "nothing"
class << self
attr_accessor :sound
end
def to_s
"I say " + self.class.sound
end
end
class Cat < Animal
self.sound = "miaow"
end
class Dog < Animal
self.sound = "woof"
end
fudge = Cat.new()
puts fudge
tip = Dog.new()
puts tip
That's how ruby treats it, there are some who argue that @@ should go away,
maybe they are right.
Hope that helps
Robert
···
On 4/21/06, Andy Gimblett <A.M.Gimblett@swansea.ac.uk> wrote:
This is just the simplest example I could think of. The actual method in the parent class is responsible for storing "stuff" in memcache and I want to dynamically set the key used to store it to the class name and the primary key. That way I won't have to worry about collisions.
For the archives, seems that
def self.what_am_i
put self
put self.name
end
will do exactly what I want (return the name of the calling class)
Thanks all!
-philip
···
2006/4/21, Philip Hallstrom <ruby@philip.pjkh.com>:
Hi all -
Given the following bit of code, I'd like it to spit out "Cat" followed by
"Dog", but what I get now is "Object" twice.
---------------------------------------------------------------
class Animal
def self.what_am_i
self.class
end
end