[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

const_defined? and inheritance

Kevin Howe

2/12/2005 9:04:00 PM

It seems that const_defined? doesnt search it's superclass:

class A
FOO = 'BAR'
end

class B < A; end

puts A.const_get(:FOO) # => 'BAR'
puts A.const_defined?(:FOO) # => true
puts B.const_get(:FOO) # => 'BAR'
puts B.const_defined?(:FOO) # => false

I had expected B.const_defined?(:FOO) to be true. Seems strange that
const_get does the lookup while const_defined? doesn't. Is there a reason
for this behaviour?

The following takes care of it:

class A
def self.const_defined?(symbol) super ||
superclass.const_defined?(symbol) end
end

But would like to know why this is.

Regards,
Kevin


4 Answers

dblack

2/12/2005 9:22:00 PM

0

Kevin Howe

2/12/2005 9:36:00 PM

0

> > class A
> > FOO = 'BAR'
> > end
> >
> > class B < A; end
> >
> > puts A.const_get(:FOO) # => 'BAR'
> > puts A.const_defined?(:FOO) # => true
> > puts B.const_get(:FOO) # => 'BAR'
> > puts B.const_defined?(:FOO) # => false
> >

> I think they're just two different operations. The constants a module
> can see ("get") is a superset of the constants it's defined.

If that were the case then B.const_get(:FOO) would raise an error since B
does not define FOO. Instead it inherits it from A, and returns the
inherited value of "BAR". But you are probably right in the sense that
const_defined? shows only those explicitly set in that particular class.
I'll just use constants.include?('FOO') instead.

Regards,
Kevin


dblack

2/12/2005 9:46:00 PM

0

Joel VanderWerf

2/12/2005 9:50:00 PM

0

Kevin Howe wrote:
>>> class A
>>> FOO = 'BAR'
>>> end
>>>
>>> class B < A; end
>>>
>>> puts A.const_get(:FOO) # => 'BAR'
>>> puts A.const_defined?(:FOO) # => true
>>> puts B.const_get(:FOO) # => 'BAR'
>>> puts B.const_defined?(:FOO) # => false

An alternative:

p defined?(B::FOO) # ==> "constant"

But this will include more than just the constants defined by A and B:

p defined?(B::Object) # ==> "constant"