Metaprogramming samples on Ruby
Содержание
- Что такое метапрограммирование и зачем оно нужно?
- В случае скриптовых языков, это изменение внутренного пространства объектов (функций, классов, переменных) в режиме runtime.
- Зачем? Как и у многих начинаний в программировании, цели следующие:
- Code reduce (less code)
- Code reuse & DRY (Don't Repeat Yourself)
- More general, concise, neat and beautiful code
- Почему Ruby хорош для метапрограммирования?
- A lot of introspection methods
- A lot of dynamic (aka metaprogramming) methods
- Pure and full OOP + strict typing + Duck typing
- Почему не Lisp?
- Попробуйте программировать структуры данных на Lisp, например, хэштаблицу. Сделайте это на чистом Lisp, пользуясь только средствами стандартного Lisp (возьмите Common Lisp, Scheme, или Haskell или др. функ. язык). Узнаете ответ. Подчеркиваю при реализации нельзя пользоваться нестандартными модулями. Обратите внимание на то, что модули, реализующие функциональность Хэштаблицы, есть во многих функциональных языках, но они целиком или частично написаны на другом языке (чаще всего Си).
- Да, красивая чистая парадигма всё есть списки (и программа и данные). Но из-за этой чистоты, многие полезные вещи, нужные программистам, в Lisp выглядят грязными. Простейший пример хранилище типа массив с индексированным доступом. Его приходится реализовывать на Си иподключать к Lisp как отдельный модуль. То есть массивы с O(1) для операции доступа к элементу не реализуются на самом Lisp. Казалось бы, ничего страшного будем пользоваться модулями написанными на Си. Но это некоторый критерий реализация структур данных на Lisp не выглядит естественной (нет состояния, нет переменных какие структуры данных! Хранимые данные в функциональных языках это некоторая фикция или грязь).
- Множество задач из жизни таковы, что половина их решения это проектирование малых и больших структур данных, а вторая половина программирование логики движения и превращений данных. Плохо скрываемое наличие сложного состояния в этих задачах сильно портит жизнь функциональным программистам, и они начинают выпрыгивать из своей парадигмы в другие языки (не потому, что что-то нельзя запрограммированть на Lisp, а потому что неудобно).
- Для метапрограммирования важно наличие богатых возможностей для интроспекции и модификации, а не гомогенность представления логики и данных, которую иногда позиционируют как большой прорыв Lisp'а.
- Примеры
- attr_accessor
- attr_accessor
- make_modifiers автоматическое создание методы модификаторов типа
sort!
или uniq!
- DSLs из Rails
- method_missing пример динамических
find_by_*
методов в ActiveRecord::Base
- См. также
Примеры кода на Ruby с использованием метапрограммирования