С определением методов во время выполнения связана техника включения модулей по мере необходимости. Я работаю над приложением Rails, где нам иногда приходится экспортировать данные в различных форматах. В 99% случаев объекту Form не нужны методы, связанные с экспортом, но в нашей задаче экспорта Rake мы делаем что-то вроде:
Form.send(:include, FormExportingMethods)
Так что у него есть только те методы, которые ему нужны.
Этот вид динамизма - одна из вещей, которые мне нравятся в Ruby. В то время как в некоторых языках вы должны заранее определить свои классы и объекты, Руби позволяет вам сказать: «О, мне нужна моя свинья, чтобы иметь крылья прямо сейчас? Я просто прикреплю их».
Обратите внимание, что в моем примере определенные объекты формы не изменяются; Форма класса есть. Это работает, потому что, когда вы отправляете сообщение объекту, он ищет в цепочке поиска метода ответ в тот момент, когда вы спрашиваете . Таким образом, вы можете создать объект, затем добавить метод в любом месте его цепочки наследования, затем вызвать метод объекта, и он будет иметь его. Очевидно, что просмотр всей цепочки наследования для каждого вызова метода стоит дорого, но это компромисс для такой гибкости.