Как переписать определенное?оператор? - PullRequest
3 голосов
/ 10 декабря 2011

если у вас есть что-то вроде:

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 Ответ

3 голосов
/ 10 декабря 2011

defined? на самом деле является оператором (а не просто синтаксическим сахаром, таким как +) и поэтому не может быть переопределен. Правильным решением было бы не использовать defined? для проверки, но вышеупомянутое const_defined?. defined? не предназначен для метапрограммирования и работает на уровне парсера, поэтому может дать довольно подробную информацию о типе выражения.

...