如何覆盖定义?运营商?

时间:2011-12-10 05:20:27

标签: ruby metaprogramming constants

如果你有类似的东西:

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)返回零。有没有办法覆盖定义?将元编程常数纳入计算的行为?

1 个答案:

答案 0 :(得分:3)

defined?实际上是一个运算符(而不仅仅是+之类的语法糖),因此无法重新定义。正确的解决方案是不使用defined?进行检查,而是使用前面提到的const_defined?defined?不适用于元编程,也适用于解析器级别,这就是为什么它可以提供有关表达类型的相当详细的信息。