При отправке сообщения объект Ruby ищет, есть ли у него метод с таким именем для ответа. Его поиск метода выполняет поиск в следующем порядке и использует первый найденный метод.
- Синглтон-методы, определенные для себя (также известные как «собственный класс»)
- Методы, определенные в его классе
- Любые модули, смешанные с его классом, в обратном порядке включения (только самое раннее включение данного модуля имеет какой-либо эффект - если суперкласс включает модуль A, а подкласс включает его снова, он игнорируется в подклассе; если подкласс включает в себя A, затем B, затем A, второй A игнорируется) ( update : обратите внимание, что это было написано до того, как
Module.prepend
существовало)
- Его родительский класс
- Любые методы, смешанные с родительским классом, родительским родителем и т. Д.
Или, проще говоря, он выглядит сам по себе, затем все в self.class.ancestors
в том порядке, в котором они перечислены.
Этот путь поиска следует в момент вызова метода; если вы создаете экземпляр класса, затем заново открываете класс и добавляете метод или смешиваете его через модуль, существующий экземпляр получит доступ к этому методу.
Если все это не удается, он проверяет, есть ли у него метод method_missing
или его класс, его родительский класс и т. Д.
У меня такой вопрос: кроме проверки кода вручную или использования примеров методов, таких как puts "I'm on module A!"
, вы можете сказать, откуда появился данный метод? Можете ли вы, например, перечислить объект методы и увидеть: «Этот класс находится в родительском классе, этот модуль - в модуле A, этот класс - в классе и переопределяет родительский класс» и т. д.?