Is this the intended behavior of const_defined?
IO::SYNC
=> 4096
IO.const_defined? :SYNC
=> false
It appears that const_defined? only returns true if the class is the
originator of the constant. If the constant was borrowed from
somewhere else (in this case, File::Constants), it returns false.
That's on purpose, right? If that's the case, I must resort to
IO.constants.member?('SYNC') for my intended behavior, I suppose.
Seems a little strange.
Dan Amelang
Hi
At Mon, 16 Jan 2006 17:05:29 +0900,
Daniel Amelang wrote in [ruby-talk:175899]:
Is this the intended behavior of const_defined?
>> IO::SYNC
=> 4096
>> IO.const_defined? :SYNC
=> false
It appears that const_defined? only returns true if the class is the
originator of the constant. If the constant was borrowed from
somewhere else (in this case, File::Constants), it returns false.
Yes.
That's on purpose, right? If that's the case, I must resort to
IO.constants.member?('SYNC') for my intended behavior, I suppose.
Seems a little strange.
defined?(IO::SYNC)
···
--
Nobu Nakada
Hi Nobu,
defined?(IO::SYNC)
In my case, the constant's name is stored in a variable. So, I'd have
to resort to doing an 'eval' if I were to follow your suggestion. So
at least I have two options now:
# Option 1 (Nobu's suggestion)
found = eval("defined?(obj::#{const})")
# Option 2 (My original idea)
found = obj.respond_to?(:constants) && obj.constants.member?(const)
Any better ideas? I usually try to stay clear of 'eval' if I can.
Dan Amelang
def const_defed(var)
var.split(/::/).inject(Object) do |left, right|
begin
left.const_get(right)
rescue NameError
break nil
end
end
end
···
On Jan 16, 2006, at 5:52 PM, Daniel Amelang wrote:
Hi Nobu,
defined?(IO::SYNC)
In my case, the constant's name is stored in a variable. So, I'd have
to resort to doing an 'eval' if I were to follow your suggestion. So
at least I have two options now:
# Option 1 (Nobu's suggestion)
found = eval("defined?(obj::#{const})")
# Option 2 (My original idea)
found = obj.respond_to?(:constants) && obj.constants.member?(const)
Any better ideas? I usually try to stay clear of 'eval' if I can.
Dan Amelang
Pretty cool!
Not what I was looking for, but may prove useful later.
Dan
···
On 1/16/06, Logan Capaldo <logancapaldo@gmail.com> wrote:
On Jan 16, 2006, at 5:52 PM, Daniel Amelang wrote:
> Hi Nobu,
>
>> defined?(IO::SYNC)
>
> In my case, the constant's name is stored in a variable. So, I'd have
> to resort to doing an 'eval' if I were to follow your suggestion. So
> at least I have two options now:
>
> # Option 1 (Nobu's suggestion)
> found = eval("defined?(obj::#{const})")
>
> # Option 2 (My original idea)
> found = obj.respond_to?(:constants) && obj.constants.member?(const)
>
> Any better ideas? I usually try to stay clear of 'eval' if I can.
>
> Dan Amelang
>
def const_defed(var)
var.split(/::/).inject(Object) do |left, right|
begin
left.const_get(right)
rescue NameError
break nil
end
end
end