Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get class-object from string "A::B::C" in Ruby?

Tags:

object

class

ruby

The following example fails

class A
  class B
  end
end
p Object.const_get 'A' # => A
p Object.const_get 'A::B' # => NameError: wrong constant name A::B

UPDATE

Questions about the topic asked earlier:

  1. Cast between String and Classname
  2. Ruby String#to_class
  3. Get a class by name in Ruby?

The last one gives a nice solution which can be evolved into

class String
  def to_class
    self.split('::').inject(Object) do |mod, class_name|
      mod.const_get(class_name)
    end
  end
end

class A
  class B
  end
end
p "A::B".to_class # => A::B
like image 799
Andrei Avatar asked Jul 23 '10 00:07

Andrei


People also ask

How do I find the class of an object in Ruby?

Use #is_a? to Determine the Instance's Class Name in Ruby If the object given is an instance of a class , it returns true ; otherwise, it returns false .

What is object class in Ruby?

Object is the default root of all Ruby objects. Object inherits from BasicObject which allows creating alternate object hierarchies. Methods on Object are available to all classes unless explicitly overridden. Object mixes in the Kernel module, making the built-in kernel functions globally accessible.

What is Object_id in Ruby?

For every object, Ruby offers a method called object_id. You guessed it, this represents a random id for the specific object. This value is a reference of the address in memory where the object is store. Every object has a unique object id that will not change throughout the life of this object.


2 Answers

You'll have to manually "parse" the colons yourself and call const_get on the parent module/class:

ruby-1.9.1-p378 > class A
ruby-1.9.1-p378 ?>  class B
ruby-1.9.1-p378 ?>    end
ruby-1.9.1-p378 ?>  end
 => nil 
ruby-1.9.1-p378 > A.const_get 'B'
 => A::B 

Someone has written a qualified_const_get that may be of interest.

like image 129
Mark Rushakoff Avatar answered Oct 09 '22 23:10

Mark Rushakoff


Here is Rails' constantize method:

def constantize(camel_cased_word)
  names = camel_cased_word.split('::')
  names.shift if names.empty? || names.first.empty?

  constant = Object
  names.each do |name|
    constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
  end
  constant
end

See, it starts at the Object on top of it all, then uses each name in between the double semicolons as a stepping stone to get to the constant you want.

like image 22
Paige Ruten Avatar answered Oct 09 '22 23:10

Paige Ruten