Почему const_missing не работает без префикса с Object? - PullRequest
2 голосов
/ 22 мая 2011

Похоже, const_missing является методом экземпляра Object.Если так, то почему этот код не работает?

module Extensions
  def const_missing(c)
    puts c
  end
end

class Object
  include Extensions
end

NonExistent.new

Чтобы заставить его работать правильно, я должен изменить def const_missing на def Object.const_missing.Почему?

1 Ответ

2 голосов
/ 22 мая 2011

Это всего лишь следствие того, как в Ruby разрешаются вызовы методов.

Сначала проверяются одноэлементные методы.Затем методы экземпляра класса, за которыми следуют предки (которые будут включенными модулями, затем суперклассы с включенными в них модулями).

Таким образом, вы можете определить Object.const_missing напрямую или включить свой модуль в класс singletonобъекта:

class << Object
  include Extensions
end

NonExistent # => prints "NonExistent"

Вы также можете получить monkeypatch Module#const_missing.

...