Is it possible to narrow down the constant search for ruby

I have a module that contains a class called String (among others.) I need to search for a class by name and gracefully back out if there is no such class.

 module Mod1 module String end end Mod1.const_get 'String' #⇒ Mod1::String Kernel.const_get '::Mod1::String' #⇒ Mod1::String 

still so good. I expect to get a NameError when I try to find a nonexistent class, and that's fine. The problem is that if there is a class with the given name that exists in the global namespace, it returns:

 Mod1.const_get 'Fixnum' #⇒ Fixnum < Integer Kernel.const_get '::Mod1::Fixnum' #⇒ Fixnum < Integer 

I understand the reasons, but my question is: is there a ready-made method for finding a constant in a given namespace?

Now I check the result with

 result.to_s.start_with?(namespace) 

but this is definitely not the most convenient way to narrow your search.

+5
source share
1 answer

Answer:

 Mod1.const_get 'Fixnum', false 

Here's the doc:

 /* * call-seq: * mod.const_get(sym, inherit=true) -> obj * mod.const_get(str, inherit=true) -> obj * * Checks for a constant with the given name in <i>mod</i>. * If +inherit+ is set, the lookup will also search * the ancestors (and +Object+ if <i>mod</i> is a +Module+). * * The value of the constant is returned if a definition is found, * otherwise a +NameError+ is raised. * * Math.const_get(:PI) #=> 3.14159265358979 * * This method will recursively look up constant names if a namespaced * class name is provided. For example: * * module Foo; class Bar; end end * Object.const_get 'Foo::Bar' * * The +inherit+ flag is respected on each lookup. For example: * * module Foo * class Bar * VAL = 10 * end * * class Baz < Bar; end * end * * Object.const_get 'Foo::Baz::VAL' # => 10 * Object.const_get 'Foo::Baz::VAL', false # => NameError * * If the argument is not a valid constant name a +NameError+ will be * raised with a warning "wrong constant name". * * Object.const_get 'foobar' #=> NameError: wrong constant name foobar * */ 

https://github.com/ruby/ruby/blob/449fbfd4d4ce47be227804c22214fed32a5b0124/object.c#L2027

+7
source

All Articles