[#393742] Getting the class of an object. — Ralph Shnelvar <ralphs@...32.com>

Consider;

14 messages 2012/03/06

[#393815] arcadia IDE requires tcl/tk and ruby-tk — Thufir Hawat <hawat.thufir@...>

which or where tcl and tk does arcadia require? Is this a gem which I

13 messages 2012/03/13

[#393952] What’s the best way to check if a feature/class has been loaded? — Nikolai Weibull <now@...>

Hi!

18 messages 2012/03/21
[#393953] Re: What’s the best way to check if a feature/class has been loaded? — Xavier Noria <fxn@...> 2012/03/21

Active Support has recently added qualified_const_* methods to Module

[#393954] Re: What’s the best way to check if a feature/class has been loaded? — Xavier Noria <fxn@...> 2012/03/21

Ah, that won't work in 1.8.

[#393959] Re: What’s the best way to check if a feature/class has been loaded? — Nikolai Weibull <now@...> 2012/03/21

On Wed, Mar 21, 2012 at 16:43, Xavier Noria <fxn@hashref.com> wrote:

[#393960] Re: What’s the best way to check if a feature/class has been loaded? — Xavier Noria <fxn@...> 2012/03/21

On Wed, Mar 21, 2012 at 8:17 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#393961] Re: What’s the best way to check if a feature/class has been loaded? — Nikolai Weibull <now@...> 2012/03/21

On Wed, Mar 21, 2012 at 20:48, Xavier Noria <fxn@hashref.com> wrote:

[#393962] Re: What’s the best way to check if a feature/class has been loaded? — Xavier Noria <fxn@...> 2012/03/21

On Wed, Mar 21, 2012 at 9:51 PM, Nikolai Weibull <now@bitwi.se> wrote:

[#393967] Re: What’s the best way to check if a feature/class has been loaded? — Nikolai Weibull <now@...> 2012/03/22

On Wed, Mar 21, 2012 at 22:11, Xavier Noria <fxn@hashref.com> wrote:

[#393969] Re: What’s the best way to check if a feature/class has been loaded? — Xavier Noria <fxn@...> 2012/03/22

On Thu, Mar 22, 2012 at 6:15 AM, Nikolai Weibull <now@bitwi.se> wrote:

[#394154] uninitialized constant SOCKSSocket — Resident Moron <lists@...>

I am running ruby 1.9.3 on a linux box. I would like to use

10 messages 2012/03/29

[#394160] Why z = Complex(1,2) rather than z = Complex.new(1,2)? — Ori Ben-Dor <lists@...>

What's this syntax, z = Complex(1,2), as opposed to z =

14 messages 2012/03/29

[#394175] shoes no such file to load -- rubygems — Mr theperson <lists@...>

I have installed shoes to develop GUI applications but when I try and

13 messages 2012/03/29

[#394201] Can't open url with a subdomain with an underscore — Jeroen van Ingen <lists@...>

I try to open the following URL: http://auto_diversen.marktplaza.nl/

10 messages 2012/03/30

[#394222] Ruby openssl ECC help plz — no name <lists@...>

I am confused on how to properly export public ECC key. I can see it

13 messages 2012/03/31

What’s the best way to check if a feature/class has been loaded?

From: Nikolai Weibull <now@...>
Date: 2012-03-21 15:23:34 UTC
List: ruby-talk #393952
Hi!

What’s the best way to check if a feature/class has been loaded?

I’ve been using

defined? A::B::C

but that fails to give me the correct result if A is a class and B::C
is defined, but A::B::C isn’t defined, as Ruby will then first resolve
A::B to the top-level constant B and then resolve C within B.

Here’s a test case:

class A
end

module B
end

p defined? A::B::C # => nil

module B
 module C
 end
end

p defined? A::B::C # => "constant"

The only solution I can think of is to do

def feature?(path)
 path.split('::').reduce(Object){ |o, e| begin o.const_get(e, false);
rescue NameError; return nil; end }
end

but that won’t work in 1.8.7, as there’s no second argument to
Module#const_get in 1.8.7.  A solution that works across the 1.8/1.9
divide might be

def feature?(path)
 const = path.split('::').reduce(Object){ |o, e| begin o.const_get(e);
rescue NameError; return nil; end }
 const.name == path ? const : nil
end

and even though that works, I’d rather have something simpler,
something built-in.

An alternative would be to check $LOADED_FEATURES, but, again, the
internals of how require works have changed between 1.8 and 1.9 and,
considering things like file-name extensions and one mustn’t forget
about autoload and its semantics, would also be best left to built-in
functionality.

So, how does one check for the presence of A::B::C without
accidentally referencing top-level constants?

In This Thread

Prev Next