Ruby – это объектно-ориентированный язык программирования, изначально разработанный в качестве замены Perl. Юкихиро Мацумото (также известный, как Matz») спроектировал и создал Ruby в Японии.
Хотя Ruby является объектно-ориентированным, он также поддерживает парадигмы функционального и императивного программирования. В отличие от C или Java, которые реализуют статическую типизацию, Ruby является динамически типизированным языком. Таким образом, Ruby похож на Python и Lisp. Ruby создавался для обеспечения продуктивности и простоты. Юзабилити и дизайну интерфейса часто отдают предпочтение скорости или параллелизму.
Так же Ruby следует "правилу наименьшего удивления", цель которого сводить к минимуму путаницу как для новых, так и для опытных пользователей. Этот принцип поощряет последовательность, общие шаблоны проектирования и повторно используемый код.
Производительность
Люди иногда отвергают Ruby, потому что он работает слишком медленно. И хотя это отчасти правда, большому количеству разработчиков на это плевать. Самые проблемные места с производительностью, которые у вас будут возникать изо дня в день, – это база данных, файловая система, интернет и ошибки. Это явно не проблемы самого Ruby, поэтому и его ускорение будет иметь незначительный эффект.
Если бы нам нужно было написать приложение для матричного преобразования, то мы бы сделали это на C, потому что такое приложение будет очень требовательным к производительности. Тем не менее, если бы мы писали веб-приложение, которое нуждалось в матричном преобразователе, мы написали его на Ruby, вызывая библиотеку C. Просто потому, что код Ruby гораздо более увлекательный и продуктивный.
Кроме того, оборудование дешевое, а разработчики нет. Если можно использовать язык программирования, такой как Ruby, который сделает программистов более продуктивными, то вы сможете повысить производительность своего кода с помощью более качественного оборудования. Вы сможете купить лучшее оборудование за сэкономленные деньги, сделав свою команду более продуктивной.
Синтаксис Ruby с примерами
Давайте рассмотрим основы синтаксиса Ruby на реальных примерах.
Ruby предоставляет встроенный механизм для проверки того, что файл содержит допустимый синтаксис Ruby. Вы можете проверить синтаксис файла, передав флаг -c и путь к файлу интерпретатору Ruby.
$ ruby -c /path/to/ruby/file
В ответ вы получите "Syntax OK", если он правильный. В противном случае будет напечатана трассировка стека, указывающая на строку, где произошла ошибка.
Комментарии
В Ruby хеш-символ (#) используется для представления комментария. Комментарии содержат документацию для вашего кода. Все, что после # в той же строке, рассматривается как комментарий, предназначенный для чтения людьми и игнорируемый интерпретатором Ruby:
variable = 2 # Это комментарий
# Это многострочный комментарий, потому что каждая
# строка начинается с символа хеша
Очень важно документировать, почему вы пишете код. Используйте комментарии, чтобы объяснить, почему вы решили реализовать свой код так, как вы это сделали, и описать альтернативные подходы, которые вы рассмотрели. Джефф Этвуд, известный в Stack Exchange и Discourse, блестяще объясняет цель комментариев следующим образом: «Код говорит вам как, комментарии говорят почему».
Например, рассмотрим следующий фрагмент кода Ruby, который покупает бекон, если в настоящее время его меньше пяти кусочков. Читая код, вы можете понять, что делает код, но не ясно, почему код был написан в первую очередь:
if bacon.strips < 5
buy_bacon
end
В следующем коде добавлен простой комментарий, объясняющий, почему мы должны покупать больше бекона, когда их меньше пяти. Полезно понять контекст этой покупки: Джейку нравится есть пять кусков бекона по утрам, поэтому мы хотим всегда иметь под рукой достаточное количество кусочков:
# Джейк ест 5 кусочков бекона каждое утро
if bacon.strips < 5
buy_bacon
end
Переменные
Как мы только что видели в предыдущем примере, переменные в Ruby назначаются слева направо:
variable = 2 # Это присваивает значение 2 переменной
Поскольку Ruby не является статически типизированным языком, вам не нужно объявлять тип переменной при его назначении. В следующих примерах переменным присваиваются очень разные значения: число, строка hello и даже объект. Нет необходимости указывать Ruby тип содержимого, которое будет храниться в переменной, перед присвоением значений:
В Ruby переменная доступна в самой внешней области ее объявления. Рассмотрим следующий пример, который лучше демонстрирует переменную область видимости. Сначала объявляется переменная верхнего уровня с именем bacon_type и ей присваивается значение crispy. Затем бекон готовится дважды, и дополнительной переменной с именем температура присваивается значение 300. Наконец, скрипт пытается получить доступ к переменной температуры, которая теперь выходит за рамки:
- Переменная bacon_type объявлена в области видимости верхнего уровня, поэтому она будет доступна везде в этом контексте.
- Мы можем получить доступ к переменной bacon_type внутри более конкретной области видимости, такой как цикл.
- Переменная, объявленная внутри области видимости, доступна только внутри этой области.
- Вне рамок объявления попытка доступа к переменной приведет к исключению (неопределенная локальная переменная или метод «температура»).
Математические операции
В Ruby представлены основные арифметические операции, такие как сложение, умножение и деление, в качестве основной функции языка:
Допустим, чтобы обеспечить продуктивную и дружелюбную рабочую среду, политика вашей компании требует, чтобы ваша команда делала перерыв на бекон каждые три часа. Несмотря на строгую политику, команда часто увлекается своей работой и забывает проверять время. Вы могли бы написать короткий скрипт на Ruby, который предупреждает команду, когда она должна остановиться и насладиться свежеприготовленным беконом:
Более сложные операции, такие как округление или полиномиальное распределение, представлены в модуле Math Ruby. Вы можете использовать метод Math.hypot в скрипте Ruby, чтобы вычислить длину диагонали для прямоугольного треугольника, возвращая сумму квадратов двух его сторон:
Math.hypot(43, 57)
Дополнительные функции и константы, такие как log, sin, sqrt, e и π, также содержатся в модуле Math.
Строки
Существует два распространенных способа создания строк в Ruby: с одинарными и двойными кавычками. Строки в одинарных кавычках имеют преимущество в виде одного нажатия клавиши и не применяют интерполяцию.
Строки в двойных кавычках полезны, когда переменные должны оцениваться как часть содержимого строки – этот процесс оценки известен как интерполяция строк. Символ хеша используется в качестве заполнителя в строке в двойных кавычках, чтобы указать Ruby, что заполнитель должен быть заменен оцененным содержимым переменной. В следующем примере #{x} используется для вставки значения x в строку.
Строки как в двойных, так и в одинарных кавычках используют символ обратной косой черты () для отображения специальных символов.
- Строки в двойных кавычках интерполируются.
- Строки в одинарных кавычках используют литерал.
Вам может будет нужно отображать специальные символы. Например, при сохранении имени игрока Джима О'Рурка в виде строки вам необходимо экранировать одинарную кавычку в его фамилии:
В качестве альтернативы, вы можете использовать двойные кавычки и избежать экранирования вообще:
Массивы
Поддержка нативных массивов в Ruby позволяет создавать списки элементов. Массивы Ruby используют обозначение в скобках, как показано в следующем примере. Массивы индексируются нулем, и интерпретатор Ruby автоматически выделяет память при добавлении новых элементов; не нужно беспокоиться о динамическом изменении размеров массивов:
- Метод length сообщает нам, сколько элементов в массиве.
- Иногда вы увидите размер, используемый как синоним длины; Ruby предлагает на выбор использование обоих.
- Добавьте один или несколько элементов в конец массива с помощью push.
- Это полезный псевдоним для push, когда вы хотите добавить только один элемент в конец.
- Массивы индексируются нулем, поэтому мы можем получить доступ к первому элементу, используя 0 в качестве индекса.
- Первый элемент также доступен через удобный первый метод.
- Чтобы дополнить первый метод, Ruby также предоставляет последний метод.
- Указание диапазона в скобках приведет к разрезу массива от первого индекса до второго индекса включительно.
Например, вы можете использовать массивы Ruby для хранения упорядоченного списка всех сотрудников в том порядке, в котором они были наняты. Каждый раз, когда новый сотрудник присоединяется к команде, он добавляется в список. Первый сотрудник имеет индекс 0, второй сотрудник – индекс 1 и т. д.
Когда новый сотрудник присоединяется к команде, его имя помещается в конец массива:
Хэши
Ruby также поддерживает хеши (иногда называемые словарями или картами на других языках). Хэши – это пары ключ-значение, которые ведут себя аналогично массивам. Хэши создаются с использованием буквенных фигурных скобок ({}):
- Доступ к отдельным элементам осуществляется через скобки, как и в массивах.
- Те же обозначения в скобках можно использовать для установки элементов на определенный ключ.
- Хэши отвечают на полезные методы, такие как ключи и значения.
Например, вы можете использовать хэши Ruby для хранения информации о популярных футболистах и их текущей статистике. Ключ в этом хеше будет именем футболиста. Значением будет другой хеш, ключом которого является название статистики, а значением – номер этой статистики. Это наглядно иллюстрируется следующими примерами данных:
Доступ к отдельному игроку осуществляется с использованием его имени в качестве ключа в хеше игроков.
Регулярные выражения
Ruby поддерживает регулярные выражения в стиле Perl, используя оператор =~:
Например, вы можете попробовать использовать регулярные выражения, чтобы найти имена в списке игроков футбольной команды, начиная с определенной буквы алфавита. Регулярные выражения могут быть привязаны с помощью символа (^), который начинает сравнение в начале строки. Следующий фрагмент кода ищет всех игроков с фамилией, начинающейся на букву F: