if you have something like:
module Real
A = 1
end
when you do defined?(Real::A) you get ‘constant’ which is a truish value. Now if i do something like:
module Virtual
def self.constants
[:A] + super
end
def self.const_missing(sym)
return 1 if sym == :A
super
end
def self.const_defined?(sym)
return true if sym == :A
super
end
end
defined?(Virtual::A) return nil. Is there some way to overwrite defined? behaviour to take metaprogrammed constants into acccount?
defined?is actually an operator (and not just syntactic sugar like+) and as such cannot be redefined. The proper solution would be to not usedefined?for checking but aforementionedconst_defined?.defined?isn’t intended for meta-programming and works on the parser level, which is why it can give rather detailed information on the type of expression.