Forum: Ruby how to figure out what class a method is in for a *class met

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
48124635945b45221ba12a26371f9e3e?d=identicon&s=25 Philip Hallstrom (Guest)
on 2006-04-21 01:15
(Received via mailing list)
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

class Cat < Animal
end

class Dog < Animal
end

puts Cat.what_am_i
puts Dog.what_am_i
---------------------------------------------------------------

The closest I can get is self.object_id which prints out different ID's,
but I'd really like the name if I can get it...

Thanks!

-philip
48124635945b45221ba12a26371f9e3e?d=identicon&s=25 Philip Hallstrom (Guest)
on 2006-04-21 01:18
(Received via mailing list)
> end
>
> The closest I can get is self.object_id which prints out different ID's, but
> I'd really like the name if I can get it...

Naturally I find it right after posting...

self.name does the trick.

-philip
8d16869783573d7ca80a676b65cf98e7?d=identicon&s=25 David Pollak (Guest)
on 2006-04-21 01:27
(Received via mailing list)
On 4/20/06, Philip Hallstrom <ruby@philip.pjkh.com> wrote:
>      end
> end


Try
def self.what_am_i
  self.name
end

Because self is an instance of Class, you want to ask it what its name
is.
F1ac78234e026a6f2126bd9d1da2d691?d=identicon&s=25 Andy Gimblett (Guest)
on 2006-04-21 10:31
(Received via mailing list)
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.

Thanks,

-Andy
703fbc991fd63e0e1db54dca9ea31b53?d=identicon&s=25 Robert Dober (Guest)
on 2006-04-21 11:32
(Received via mailing list)
On 4/21/06, Andy Gimblett <A.M.Gimblett@swansea.ac.uk> wrote:
> class Animal
> 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

>
> --
> Andy Gimblett
> Computer Science Department
> University of Wales Swansea
> http://www.cs.swan.ac.uk/~csandy/
>
>


--
Deux choses sont infinies : l'univers et la bêtise humaine ; en ce qui
concerne l'univers, je n'en ai pas acquis la certitude absolue.

- Albert Einstein
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2006-04-21 11:36
(Received via mailing list)
2006/4/21, Philip Hallstrom <ruby@philip.pjkh.com>:
> end
>
> The closest I can get is self.object_id which prints out different ID's,
> but I'd really like the name if I can get it...

Let me get this straight: you have a class object and you want a
method that returns this class object? The code that does what you
want is this:

def self.what_am_i?
  self
end

But this seems a rather weird thing to do...

Did you actually try this?

puts Cat, Dog

You can even use the name, but the output won't differ

puts Cat.name, Dog.name

If your problem is something else, please let us know.

Kind regards

robert
48124635945b45221ba12a26371f9e3e?d=identicon&s=25 Philip Hallstrom (Guest)
on 2006-04-21 18:46
(Received via mailing list)
>>      end
>> ---------------------------------------------------------------
> end
>
> But this seems a rather weird thing to do...

:-)  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
This topic is locked and can not be replied to.