9 февраля 2011 г.

Чёрная магия Ruby

На работе понадобилось поменять пару вещей в Redmine — написан он на Ruby on Rails. Случилось то, что так давно откладывал — я познакомился с Ruby и RoR.

Ruby произвёл неоднозначное впечатление большого хака, из которого к тому же торчат уши зубодробительного Perl. Но хак этот эффективный и в умелых руках работает со страшной силой. К RoR эти слова применимы в квадрате — это ещё бóльшая чёрная магия. Японское происхождение частично объясняет странность Ruby.

Избранные места из документации Ruby:
  • В Ruby всё — объекты. Даже числа. Чего стоит, например, такой код:
    5.times { |i| print i, ' ' }
    Этот кусочек иллюстрирует ещё одну странную, но мощную фишку — передача кусков кода в виде аргументов функции. Похоже на lambda-функции в Python, но мощнее и применяется повсеместно.
  • При записи числа допустима, например, следующая форма:
    a = 1_000_000
    Чтобы, значит, читабельность кода увеличить.
  • Ruby вообще любит использовать ASCII-таблицу по максимуму. Функция проверки валидности может называться valid?, а сортировка массива "in place" — sort!.
  • Как и многие языки, в Ruby объекты могут наследоваться лишь от одного родителя. Но можно включать в класс код из других модулей, при этом их функции становятся методами данного класса — это ж настоящий monkey patching!
  • Определение класса может состоять из несколько кусков. Т.е. мы начали определять класс A, потом пошло определение класса B, потом мы опять продолжили определить класс A. На практике это означает, что можно переопределить поведение даже базовых классов, того же String. Вот это действительно monkey patching.
  • И ещё для Ruby написано самое странное руководство из тех, что я встречал.
В заключение можно ещё раз повторить: Ruby — очень эффективный инструмент в умелых руках. В неумелых он вносит хаос в код и мозг программиста.

Лично мне ближе элегантность Python, замешанная на дзене. ;)