Динамическое определение методов
Научитесь динамически определять и вызывать методы с помощью define_method и method_missing
«Динамическое определение методов» — бесплатный урок Ruby Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.
Динамическое создание методов
Динамическое определение методов
В Руби методы можно создавать динамически во время выполнения.
Это позволяет писать более гибкий код, пригодный для повторного использования.

Использование define_method
Использование define_method
Метод define_method позволяет динамически определять методы.
class Person
define_method(:greet) { puts 'Hello!' }
end
p = Person.new
p.greetИспользование define_method с параметрами
Использование define_method с параметрами
В динамически созданные методы можно передавать аргументы.
class Person
define_method(:greet) { |name| puts "Hello, #{name}!" }
end
p = Person.new
p.greet('Alice')Использование method_missing
Использование method_missing
Метод method_missing перехватывает вызовы неопределённых методов.
class Person
def method_missing(name, *args)
puts "Method '#{name}' is missing!"
end
end
p = Person.new
p.unknown_methodДинамическая обработка method_missing
Динамическая обработка method_missing
С помощью method_missing можно реализовать гибкую обработку методов.
class DynamicPerson
def method_missing(name, *args)
if name.to_s.start_with?('say_')
puts "You asked me to say: #{name.to_s.split('_')[1..-1].join(' ')}"
else
super
end
end
end
p = DynamicPerson.new
p.say_hello_worldПереопределение respond_to_missing?
Переопределение respond_to_missing?
Чтобы корректно обрабатывать проверки методов, переопределите respond_to_missing?.
class DynamicPerson
def method_missing(name, *args)
if name.to_s.start_with?('say_')
puts "Saying: #{name.to_s.split('_')[1..-1].join(' ')}"
else
super
end
end
def respond_to_missing?(name, include_private = false)
name.to_s.start_with?('say_') || super
end
end
p = DynamicPerson.new
puts p.respond_to?(:say_hello)Использование method_missing для динамических средств чтения и записи
Использование method_missing для динамических средств чтения и записи
С помощью method_missing можно создавать динамические атрибуты.
class DynamicPerson
def initialize
@data = {}
end
def method_missing(name, *args)
attribute = name.to_s.sub(/=$/, '')
if name.to_s.end_with?('=')
@data[attribute] = args.first
else
@data[attribute]
end
end
end
p = DynamicPerson.new
p.name = 'Alice'
puts p.nameРиски method_missing для безопасности
Риски method_missing для безопасности
Неправильное использование method_missing может привести к рискам:
- непредвиденное поведение при обработке неизвестных методов;
- возможные проблемы с производительностью из-за чрезмерного поиска методов;
- уязвимости безопасности при совместном использовании с пользовательским вводом.
Повторение темы динамических методов
Поздравляем!
Вы научились динамически определять и вызывать методы в Руби.
Далее Вы изучите открытые классы и изменение классов на лету.

Часто задаваемые вопросы
Урок «Динамическое определение методов» бесплатный?
Да — полный текст урока «Динамическое определение методов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.
Чему я научусь в уроке «Динамическое определение методов»?
Научитесь динамически определять и вызывать методы с помощью define_method и method_missing Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Ruby Academy?
Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Динамическое определение методов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Ruby Academy?
Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое метапрограммирование?
- Динамическое определение методов
- Открытые классы и исправление обезьянки
- Использование send и eval