Using a string to find a class

I've got a string, and I want to find out if there's a class with that
name. So something like

class_exists? "Foo"

and then I can eval it if it does, I guess. Or is there a better way
than eval in that case? At any rate, I just want to be able to take a
string and find out if there's a class with that name or not.

Thanks,
Pat

Hi Pat

This ones come up a few times on the list

is one that I remember particulalry.

Although in some methods that I have seen in the rails source there has been

string_name.camelize.constantize

This will return a class object specified by name.
eg

def do_somthing( class_name )
  obj = class_name.to_s.camelize.constantize
  obj.new
end

Hope this works for you

···

On 6/8/06, Pat Maddox <pergesu@gmail.com> wrote:

I've got a string, and I want to find out if there's a class with that
name. So something like

class_exists? "Foo"

and then I can eval it if it does, I guess. Or is there a better way
than eval in that case? At any rate, I just want to be able to take a
string and find out if there's a class with that name or not.

Thanks,
Pat

Pat Maddox wrote:

I've got a string, and I want to find out if there's a class with that
name. So something like

class_exists? "Foo"

and then I can eval it if it does, I guess. Or is there a better way
than eval in that case? At any rate, I just want to be able to take a
string and find out if there's a class with that name or not.

module.const_get "Foo"
# or just
const_get "Foo"

Cheers,
Dave

Use Facets' kernel/constant

   constant(name)

or string/to_const

  name.to_const

http:://facets.rubyforge.org

T.

} I've got a string, and I want to find out if there's a class with that
} name. So something like
}
} class_exists? "Foo"
}
} and then I can eval it if it does, I guess. Or is there a better way
} than eval in that case? At any rate, I just want to be able to take a
} string and find out if there's a class with that name or not.

http://redcorundum.blogspot.com/2006/05/kernelqualifiedconstget.html

} Thanks,
} Pat
--Greg

···

On Thu, Jun 08, 2006 at 11:26:21AM +0900, Pat Maddox wrote:

Dave Burt wrote:

Pat Maddox wrote:

I've got a string, and I want to find out if there's a class with that
name. So something like

class_exists? "Foo"

and then I can eval it if it does, I guess. Or is there a better way
than eval in that case? At any rate, I just want to be able to take a
string and find out if there's a class with that name or not.

module.const_get "Foo"
# or just
const_get "Foo"

You'll get an exception if Foo isn't defined.

And not every constant refers to a class you can instantiate:

   class Bar ; end
   kls = Object.const_get "Bar"
   c = kls.new() # OK

   Foo = 12
   kls = Object.const_get "Foo"
   c = kls.new() # Not so OK

Quick version:

  def class_exists? kls
   begin
     kls = Object.const_get kls
     kls.kind_of? Class
   rescue Exception
     false
   end
  end

  def new_if_class kls, default = nil
   class_exists?( kls ) ? Object.const_get( kls ).new : default
  end

  b = new_if_class "Bar"
  p b

  c = new_if_class "Foo"
  p c

···

--
James Britt

"Take eloquence and wring its neck."
  - Paul Verlaine

[...]
} Although in some methods that I have seen in the rails source there has been
}
} string_name.camelize.constantize
}
} This will return a class object specified by name.
} eg
}
} def do_somthing( class_name )
} obj = class_name.to_s.camelize.constantize
} obj.new
} end

Both #camelize and #constantize are Rails extensions.

} Hope this works for you
--Greg

···

On Thu, Jun 08, 2006 at 11:38:42AM +0900, Daniel N wrote:

} On 6/8/06, Pat Maddox <pergesu@gmail.com> wrote:
} >I've got a string, and I want to find out if there's a class with that
} >name. So something like
} >
} >class_exists? "Foo"
} >
} >and then I can eval it if it does, I guess. Or is there a better way
} >than eval in that case? At any rate, I just want to be able to take a
} >string and find out if there's a class with that name or not.
} >
} >Thanks,
} >Pat
} >
} >
}
}