10 причин для перехода на Ruby

Я познакомился с Ruby сравнительно недавно, благодаря чудесному фреймворку Ruby on Rails. Я не считаю себя экспертом в Ruby, но я прочитал PickAxe, написал несколько утилит на Ruby для личного пользования, а также разрабатываю на Rails в свободное время.

Ruby на данный момент, мой основной язык. Начинал же я с TurboPascal в школе, изучал C и C++ в университете, диссертацию писал на Java, а еще я изучал PHP с нуля, так как хотел научиться делать веб-сайты быстро и легко. Думаю, что написание кода для меня это некая форма развлечения, а уж потом все остальное. В начале у меня были размышления, какой язык изучать, Python или Ruby. Я выбрал второй, так как не хотел, чтоб неправильные отступы были причиной неполадок в моем коде.

Есть целая куча введений, руководств, статьей и эссе, написанных гуру, о том, как получить максимум пользы от Ruby. Данная статья ничем таким не является.

Это более скромный, неполный перечень причин, которые могут (или не могут) побудить вас использовать Ruby, ну или в крайнем случае поиграть с ним. Предостережение: если вы используете другой язык программирования для работы или в других целях — не жалуйтесь мне, если больше не захотите им пользоваться. Именно это и произошло со мной, но для меня это не столь важно. Ruby чудесный и элегантный язык и как многие подобные вещи, он может захватить ваш разум и поломать душу.

Короче, вы — предупреждены.

Зачем изучать Ruby?


1. Вы получаете все удобства (удовольствия) без уловок.

Ruby позаимствовал все лучшее из других языков программирования, от smalltalk до Java, от Perl до Python. Вот базовые возможности, которые вы в принципе могли видеть и в других языках:

  • Исключения. Верите или нет, исключения являются одной из важнейших вещей при разработке программ любого рода. Программисты на PHP4, не знают ничего о них и будут говорить вам, что можно просто печатать(ошибки) на экран или использовать их собственный «супер-пупер» класс для обслуживания ошибок. К счастью для всех нас, Ruby поставляется с try/catch (или еще лучше begin/rescue) блоками и набором предопределенных, расширяемых Исключений, для правильной обработки ошибок.
  • Пространства имен: модули Ruby делают использование пространства имен легким, это должно понравиться энтузиастам C++ и Java.
  • Встроенные регулярные выражения: Для всех знатоков Perl, вы можете заключить нечто в // и оно становится регулярным выражение, готовым для сравнения (для этого используем оператор =~).
  • Перегрузка операторов: Ruby позволяет определять операторы, такие как +, -, >, и т.д. для любого вашего класса.
  • Пакеты: называемые «gems»(камешки), они действительно оправдывают свое название, кроме того — они работают. Пакеты поддерживают зависимости, а еще могут быть как кросс-платформенные, так и платформо-зависимыми.
  • Интерактивная консоль: может использоваться для тестирования кода интерактивно, подобно консоли Python

2. Вы полюбите мелочи.

Ruby изящен. Почему? Потому-что он не старается делать код лаконичным настолько, что бы это мешало читабельности и пониманию. Есть несколько советов, которые могут вам помочь:

  • Вы можете использовать оба оператора if и unless в условных выражениях. Кончно же вы можете использовать if с противоположным значением выражения, но использования unless обычно приводит к меньшему числу ошибок. Кроме того, вы можете использовать оба оператора, как условные модификаторы, ставя их после выражения, а не до:order.new unless order.exists
  • Можно использовать знаки вопроса и восклицания в конце имени метода. Данное соглашение не навязывается, но знак «?» используется, когда метод возвращает true или false, в то время, как знак «!» используется для методов, делающих нечто необратимое, на подобии удаления записи из базы данных, отщепления последнего символа из строки и т.п.
  • Можно использовать псевдонимы (alias) для уже созданных методов. Таким образом можно получить методы exist и exists, без накладных расходов и без повторений.
  • Вы можете использовать директивы attr_reader, attr_writer или attr_accessor для автоматического создания getter/setteer для членов класса.
  • И еще некоторое соглашение об именах: константы, классы и модули пишут с заглавной буквы, методы и члены класса должны начинаться с маленькой буквы, глобальные переменные именуют начиная с «$», имена переменных объекта начинаются с «@», а имена переменных класса с «@@», ну и т.д.
  • При вызове методов, можно не писать скобки. Можно писать write File.open("/home/h3rald/test.txt") или просто File.open "/home/h3rald/test.txt", что особенно удобно с методами, без аргументов.

3. Больше не нужно использовать точку с запятой.

Хотите написать следующую инструкцию? Просто переходите на новую строку. Нажмите «Enter» и готово. В Ruby как и в Python, новая линия разделяет инструкции, так что вам не придется все время ставить точку с запятой. К сожалению это означает, что подобно фанатам C++, мы не сможем написать программу в одну строчку. Но это не так уж и плохо, правда?

4. Все является объектом, как это и должно быть.

Когда я изучал Java, мне говорили, что все является объектом.

- «Че, 14 и 374346.678 — объекты?»
- «Нет, глупыш, это числа!»

В Ruby числа, символы, булевы значения и все остальное является объектом. Серьезно. Это означает, что можно писать вещи подобно этим:
"YOU SHOULDN'T ALWAYS USE CAPITALS".lowcase # вернет "you shouldn't always use capitals", вместо нечто такого:
# PHP Code
strtolower("YOU SHOULDN'T ALWAYS USE CAPITALS")

Этим вы экономите время, экономите скобки и так более логично.

5. Все имеет значение.

Или «больше не надо использовать return для возврата значений». Если побыстрячку, то так: все инструкции в Ruby возвращают значение, даже присваивание переменных, так что вам действительно не нужно использовать ключевое слово «return» в конце методов. Значение последнего присваивания всегда будет возвращено.

6. Можете изменять окружение любым доступным способом.

Впервые увидев это, я был впечатлен. Представьте типичную ситуацию: вы стали использовать системный класс или класс, написанный кем-то другим и поняли, что вам надо некий дополнительный метод в нем. Есть несколько путей для решения этой проблемы в типичных языках программирования:

  • Вы изменяете исходный код класса, если вы имеете к нему доступ. Но обычно это — плохая идея, не делайте так.
  • Вы наследуете свой класс от того и добавляете к нему новый метод. Обычно это — хорошая идея. Но из-за одного метода это может оказаться несколько монообразным. Кроме того, придется немного подправить другой свой код соответственно.
  • Можно просто создать метод вне класса. Это сработает, но будет не очень изящно, а еще — идет в разрез с ООП.

В Ruby вы можете добавить метод в оригинальный класс, без правки исходных кодов. Это можно сделать даже для системного класса.
Мы хотим добавить метод, для пересчета значений из метров в футы? Просто расширим класс Numeric, как показано:

class Numeric
   def feet
     self * 3.2808399
   end
end

С этого момента, все наши числа, будут иметь новый метод, который может использоваться, как любой другой:
5.feet # возвратит 16.4041995
Классы в Ruby никогда не закрываются и могут быть расширены в любой момент, из любого места. Естественно использовать такую возможность надо с осторожностью!

7. Вы не сможете получать единорогов из птиц и конец, но вы получите ослов, если захотите.

Я четко помню, как моя учительница по C++, использовала животных, для иллюстрации основных концепций объектно-ориентированного программирования — классов и наследования. Было нечто загадочно, когда объясняла нам множественное наследование, образовывая «пегаса» из «птиц» и «лошадей». Сумасшедшие вещи, Ruby не позволяет множественного наследования. Это выглядит как тренд и в конце-концов это дело вкуса. Я не в восторге от множественного наследования, так как это может привести к непредсказуемым вещам. Несмотря на это есть возможность создания нечто подобного, используя модули Ruby, так что переменные и методы одного модуля, будут добавлены в определенный класс, если модуль включен в него.

8. XML — реально ненужен.

XML — красивый, общеупотребительный, язык разметки, который может быть обработан всеми языками программирования и используется повсеместно. К сожалению, он слишком громоздкий для написания, трудный для обработки(парсинга) и, давайте будем честны — трудный для чтения в большинстве случаев. А вот взгляните на следующий фрагмент:

regexp: !ruby/regexp /a-zA-Z/
number: 4.
string: a string

Безусловно это легче и проще XML, правда? Добро пожаловать в YAML, любимый (но не единственный) язык разметки Ruby, с помощью которого любой объект может быть представлен в простом, лаконичном, но полном виде.
Ruby способен работать с XML, но простота YAML подкупила многих разработчиков, которые теперь используют его вместо XML, например для файлов конфигурации (так поступили в Rails). Фрагмент, представленный выше, был получен исполнением следующего фрагмента кода:
{"string" => "a string", "number" => 4.7, "regexp" => /a-zA-Z/}.to_yaml
Метод to_yaml, определен для класса Object, который является родителем для всех остальных объектов, а потому доступен для всех объектов Ruby. Это позволяет преобразовывать объекты в YAML и обратно, абсолютно прозрачно для разработчика. Круто, да?

9. Лямбда — нечто больше, чем просто греческая буковка.

Ruby позаимствовал некую магию из Lisp и Perl в объекты и блоки Proc. Proc — это «блок кода, связанный с набором локальных переменных. Однажды связанные, они могут вызываться в различных контекстах и все еще обращаться к тем переменным.». Поглядим на следующие:

def gen_times(factor)
   return Proc.new {|n| n*factor }
end

times3 = gen_times(3)
times5 = gen_times(5)

times3.call(12) #=> 36
times5.call(5) #=> 25
times3.call(times5.call(4)) #=> 60

Можно было использовать ключевое слово lambda вместо Proc.new, на результат это не влияет. Это могло показаться знакомым людям, знающим Perl и Python (или Lisp) . Такое можно сделать даже на PHP, но не много людей пользуются этой возможностью.
Кроме того в Ruby широко используются блоки типа «не созданные Proc», например, для итерации по содержимому объекта и исполнения некоторого кода, подобно методу each, доступного для класса Array:
[1, 2, 4, 6, 8].each {|c| puts c*2} #=> возвратит каждый элемент, умноженный на 2
Если код не умещается на одной строчке, рекомендуется использовать конструкцию do ... end, вместо использования скобок. Фаны Ruby не любят скобок.

10. Вы можете использовать Rails.

Последнее, но не по важности... Вы всегда можете использовать Rails для разработки веб-приложений. Разработка будет не настолько простой, как с PHP, но Rails были написаны на Ruby, поскольку он имеет возможности, отсутствующие в других языках.

Заключение

Время вышло. Возможно вы уже задумываетесь о взгляде на Ruby, возможно вы уже пробовали его, а возможно вы просто проигнорировали его. Как бы там ни было, в следующий раз, когда глядя на свой код, он будет казаться страшным, а размер его устрашающим — не обвиняйте меня.

Обсуждение

Re: 10 причин для перехода на Ruby

Спасибо, мы прислушались -:)

Вход для пользователей