Метапрограммирование — это возможность писать код, который изменяет поведение другого кода на лету. Ruby — один из тех языков, где такие техники встроены в саму философию языка.
В этой серии разберём ключевые инструменты, которые Ruby предоставляет для метапрограммирования, с примерами и практическими кейсами.
📚 Основные темы
📞 Вызов методов динамически
send__send__public_send
Эти методы позволяют вызывать методы по имени, которое хранится в переменной, даже если метод приватный.
🔍 Информация о методах
methodrespond_to?respond_to_missing?method_defined?instance_methodssingleton_methods
Как проверить, есть ли метод, получить ссылку на него или узнать, кто что умеет.
🧑🎓 Работа с классами и модулями
class_evalmodule_evalinstance_evalclass_execmodule_execinstance_exec
Создание и изменение методов, настройка поведения классов и модулей в рантайме.
🪄 Создание хуков
method_missingdefine_singleton_method
Перехват вызовов несуществующих методов и динамическое создание методов.
📦 Работа с константами и переменными
const_get,const_set,const_defined?,remove_constinstance_variable_get,instance_variable_set,instance_variablesclass_variable_get,class_variable_set,class_variables
Доступ и изменение переменных и констант внутри объектов и классов.
🔗 Работа с наследованием и цепочкой классов
included,extended,prependedsuperclass,ancestors
Анализ цепочек наследования и подключение модулей.
🧑🏫 Специальные методы
method_added,singleton_method_addedmethod_removed,singleton_method_removedmethod_undefined,singleton_method_undefined
Специальные хуки, которые срабатывают при добавлении, удалении или изменении методов.
🪢 Системные
evalbindingKernel#tap
Выполнение динамического кода и управление контекстом исполнения.
⚙️ Когда это применять
Метапрограммирование полезно:
- для построения DSL (например, ActiveRecord или RSpec)
- при создании фреймворков и библиотек
- для уменьшения повторяющегося кода (DRY)
- в случаях, когда обычные средства ООП не дают нужной гибкости
⚠️ Внимание: Метапрограммирование может усложнить отладку, ухудшить читаемость и привести к ошибкам в рантайме. Используйте его осознанно.