ruby - get name of class from class method
Asked Answered
G

2

10

I am trying to get the name of the class from within a static method within the class:

class A
  def self.get_class_name
    self.class.name.underscore.capitalize.constantize
  end
end

Though this returns Class instead of A. Any thoughts on how do I get A instead?

Eventually I also want to have a class B that inherits from A that will use the same method and will return B when called.

The reason I am doing this is because I have another object under this domain eventually: A::SomeOtherClass which I want to use using the result I receive.

Gingerly answered 6/7, 2015 at 13:11 Comment(6)
Is the method supposed to return a string, i.e. "A"?Howlet
@Stefan, I think he was just trying to understand how to get the current class name inside a class method. This is probably just an example.Stonemason
Do you want the class A or the name (string) "A"?Beckiebeckley
What is constantize in Ruby?Beckiebeckley
Hey everyone, essentially I want to return the class object so I can use it somewhere else. But the string works as well :)Gingerly
@DanBenjamin from within class methods, self returns the class object and name returns the class name.Howlet
S
15

Remove .class:

class A
  def self.get_class_name
    self.name.underscore.capitalize.constantize
  end
end

self in a context of a class (rather than the context of an instance method) refers to the class itself.

This is why you write def self.get_class_name to define a class method. This means add method get_class_name to self (aka A). It is equivalent to def A.get_class_method.

It is also why when you tried self.class.name you got Class - the Object#class of A is Class.

To make this clearer, consider the output of:

class A
  puts "Outside: #{self}"

  def self.some_class_method
    puts "Inside class method: #{self}"
  end

  def some_instance_method
    puts "Inside instance method: #{self}"
  end
end

A.some_class_method
A.new.some_instance_method

Which is:

Outside: A
Inside class method: A
Inside instance method: #<A:0x218c8b0>
Stonemason answered 6/7, 2015 at 13:16 Comment(0)
A
0

The output for this:

class NiceClass
  def self.my_class_method
    puts "This is my #{name}"
  end
end

NiceClass.my_class_method

Will be:

This is my NiceClass
Aquiculture answered 5/5, 2020 at 14:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.