Книга: Программирование на языке Ruby
11.3.6. Метод const_missing
11.3.6. Метод const_missing
Метод const_missing
аналогичен методу method_missing
. При попытке обратиться к неизвестной константе вызывается этот метод — если он, конечно, определен. В качестве параметра ему передается символ, ссылающийся на константу.
Чтобы перехватывать обращения к отсутствующим константам глобально, определите следующий метод в самом классе Module
(это родитель класса Class
).
class Module
def const_missing(x)
"Из Module"
end
end
class X
end
p X::BAR # "Из Module"
p BAR # "Из Module"
p Array::BAR # "Из Module"
Можно выполнить в нем любые действия: вернуть фиктивное значение константы, вычислить его и т.д. Помните класс Roman
из главы 6? Воспользуемся им, чтобы трактовать любые последовательности римских цифр как числовые константы:
class Module
def const_missing(name)
Roman.decode(name)
end
end
year1 = MCMLCCIV # 1974
year2 = MMVIII # 2008
Если такая глобальность вам не нужна, определите этот метод на уровне конкретного класса. Тогда он будет вызываться из этого класса и его потомков.
class Alpha
def self.const_missing(sym)
"В Alpha нет #{sym}"
end
end
class Beta
def self.const_missing(sym)
"В Beta нет #{sym}."
end
end
class A < Alpha
end
class В < Beta
end
p Alpha::FOO # "В Alpha нет FOO"
p Beta::FOO # "В Beta нет FOO"
p A::FOO # "В Alpha нет FOO"
p В::FOO # "В Beta нет FOO"
- 11.3.1. Динамическая интерпретация кода
- 11.3.2. Метод const_get
- 11.3.3. Динамическое создание экземпляра класса, заданного своим именем
- 11.3.4. Получение и установка переменных экземпляра
- 11.3.5. Метод define_method
- 11.3.6. Метод const_missing
- 11.3.7. Удаление определений
- 11.3.8. Получение списка определенных сущностей
- 11.3.9. Просмотр стека вызовов
- 11.3.10. Мониторинг выполнения программы
- 11.3.11. Обход пространства объектов
- 11.3.12. Обработка вызовов несуществующих методов
- 11.3.13. Отслеживание изменений в определении класса или объекта
- 11.3.14. Определение чистильщиков для объектов
- Special String Constants
- Constructors and Destructors
- Constants
- 4.2. Linux Kernel Construction
- 3.1.8 Constants
- Inheritance and Constructors
- Calling Base Class Constructors
- Using Constraints in a Generic Type
- Constructing New Pathnames
- 7. Macros: Standard Control Constructs
- Ограниченная универсальность (Constrained genericity)
- Использование ключевого слова const