[#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

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

From: Nikolai Weibull <now@...>
Date: 2012-03-22 05:15:15 UTC
List: ruby-talk #393967
On Wed, Mar 21, 2012 at 22:11, Xavier Noria <fxn@hashref.com> wrote:
> On Wed, Mar 21, 2012 at 9:51 PM, Nikolai Weibull <now@bitwi.se> wrote:
>
>> There=E2=80=99s a timing issue with using const_defined? followed by con=
st_get
>> instead of calling const_get directly and catching NameError.
>
>
> What do you mean?

I mean that if const_defined? returns true, then between that code
being executed and the call to const_get, some other piece of code may
remove the constant, resulting in an uncaught NameError.

> The problem with const_get is that it follows the ancestors, of course, a=
nd
> you have no way around that in 1.8.

Yes, we=E2=80=99ve already come to that conclusion.  You don=E2=80=99t need=
 to keep
repeating it.

I see that you completely cut out the part about const_defined? not
calling const_missing, which is a rather big part of the problem with
using const_defined? in the first place.

>> I guess
>>
>> def feature?(path)
>> =C2=A0 path.split('::').reduce(Object){ |o, e|
>> =C2=A0 =C2=A0 c =3D begin o.const_get(e); rescue NameError; return nil e=
nd
>> =C2=A0 =C2=A0 return nil if c =3D=3D (o !=3D Object and begin Object.con=
st_get(e);
>> rescue NameError; nil end)
>> =C2=A0 =C2=A0 c
>> =C2=A0 }
>> end

> Nikolai, I don't really understand what you need.

Xavier, please don=E2=80=99t begin sentences with the person you=E2=80=99re=
 responding
to=E2=80=99s name like that.  It=E2=80=99s like your speaking to me as if I=
 was a
child and it feels very condescending.

> You are askind for
> defined? X::Y that goes step by step and your original code does raise an
> error for X::Y integer.

I don=E2=80=99t follow.

> Then this second version cannot say that X::Y is defined in
>
> =C2=A0 =C2=A0 module X
> =C2=A0 =C2=A0 =C2=A0 Y =3D nil
> =C2=A0 =C2=A0end

True.

> And you refuse to reuse much more simple and proven existing solutions.

You=E2=80=99re making it sound like I=E2=80=99m being stubborn.  I just don=
=E2=80=99t think
your proposed solution is better.

> You want something with so special semantics that definitely is NOT
> built-in. That answers you original question.

Thank you for building me a straw man.  I=E2=80=99ve always wanted one.

I want a way to tell if a class or module has been defined/loaded.
The check would then be to see if X was loaded in your example above,
not X::Y.

An alternative is to check $LOADED_FEATURES.  This isn=E2=80=99t
straightforward either, as it doesn=E2=80=99t contain the exact argument gi=
ven
to require.  There are internal functions like rb_provided that could
have been exposed to make it easy to check if a feature had been
loaded/is available.

This part of Ruby is surely inspired by Emacs=E2=80=99 way of doing this, s=
ee

http://www.gnu.org/software/emacs/manual/html_node/elisp/Named-Features.htm=
l

but doesn=E2=80=99t provide a way to check if a feature has been loaded.
(There=E2=80=99s a difference here, of course, as Ruby implicitly uses the
(expanded) path, with possible suffixes/extensions, of the argument to
require as the feature, not a symbol as Emacs forces you to explicitly
use as an argument to provide.)

To sum up, ruby should provide a method =E2=80=9Cprovided?=E2=80=9D that ch=
ecks if its
argument would return true or false when given as an argument to
require.  Provided? would return this results negation.

Checking the presence of constants is a workaround that I=E2=80=99ve been
using in the past, but was recently burned by, as, even in the case of
using defined?, this may travel unwanted paths in the resolution of
such constants.

In This Thread