如果你有类似的东西:
module Real
A = 1
end
当你defined?(Real::A)
时,你会得到'常数',这是一个值得一试的价值。现在,如果我做了类似的事情:
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)
返回零。有没有办法覆盖定义?将元编程常数纳入计算的行为?
答案 0 :(得分:3)
defined?
实际上是一个运算符(而不仅仅是+
之类的语法糖),因此无法重新定义。正确的解决方案是不使用defined?
进行检查,而是使用前面提到的const_defined?
。 defined?
不适用于元编程,也适用于解析器级别,这就是为什么它可以提供有关表达类型的相当详细的信息。