Эта статья посвящается моим друзьям/знакомым PHP- (и не только) программистам, которым лень/некогда (зачеркнуть второе лишнее) познакомиться с Ruby и освоить азы этого языка.
Установка
Ruby предоставляет интерактивную консоль irb, в которой можно вводить код и сразу видеть результат его выполнения (аналогично js-консоли в firebug). irb устанавливается вместе с самим Ruby, поэтому будем ставить его.
Сразу обращу внимание - есть способ пропустить этот шаг, и перейти на tryruby, где аналогичная консоль (с некоторыми разумными ограничениями) доступна прямо в браузере. Для тех, кто не боится процесса установки (а, возможно, Ruby уже есть в вашей системе), этот раздел.
Windows
Честно говоря, ни разу не пробовал заниматься подобными извращениями, но говорят, что это работает (там в комплекте и Ruby, и рельсы, и еще докучи всякого небесполезного барахла).
Mac OS X
Начиная с 10.5 (а, возможно, и с 10.4, точно не знаю) Ruby предустановлен в системе, и достаточно просто открыть Терминал.app и набрать irb; но там предустановлена стремительно устаревающая версия 1.8, и стоит установить последнюю самому. Самый удобный способ - это использовать RVM:
1 2 3 4 5 6 7 8 9 10 11 | |
Пользователям zsh нужно заменить .bash_profile на .zshrc - хотя они и так об этом знают.
При ручной установке Ruby необходимо ставить дополнительные библиотеки вроде readline, и подключать их при компиляции интерпретатора Ruby - RVM делает это автоматически.
Linux
Ruby можно поставить из репозиториев большинства дистрибутивов, но иногда приходится подолгу ждать обновления пакета, чтобы получить свежую версию Ruby; также всегда можно собрать из исходников, но не все любят этим заниматься (особенно пользователи дистрибутивов, в которых установка пакета сводится к команде наподобие sudo apt-get install ruby); поэтому, опять же, я предлагаю использовать RVM, описанный в предыдущем подразделе.
irb
irb (Interactive Ruby Shell) - это консоль Ruby. Запускается, как несложно догадаться, командой
1
| |
Ввод любой строки кода, которая возвращает какое-то значение, повлечет за собой вывод этого значения:
1 2 | |
(узнав об этом, вскоре я начал использовать irb как калькулятор :) так как всегда держу открытым хотя бы одно окно консоли)
Методы
В Ruby не существует жесткого разделения на числа, строки, массивы и объекты - любая переменная является ссылкой на объект. Объект, в свою очередь, всегда относится к определенному классу. А у объектов, как мы знаем из ООП, обычно есть методы.
В Ruby обращение к методу объекта осуществляется через ‘.’ (точку).
1 2 3 4 | |
Типы
В Ruby нет такого понятия, как тип переменной; его успешно заменяет класс объекта. Например, объект “hello” будет принадлежать классу String, а объект 3.14 - классу Float. Рассмотрим самые важные классы, зачастую представляемые в других языках примитивами.
String
Строки в Ruby можно создавать несколькими способами. Самый популярный - это использование одинарных либо двойных кавычек, во втором случае происходит интерполяция переменных:
1 2 3 4 5 6 | |
Класс String предоставляет множество полезных методов для работы со строками. Например, для разбиения строки на части по определенному разделителю можно использовать метод split:
1 2 3 4 | |
Fixnum
Целые числа в определенном диапазоне (как правило это −230 … 230 - 1 или −262 … 262 - 1) относятся к классу Fixnum. Более крупные числа относятся к классу Bignum.
Для работы с числами доступна вся стандартная арифметика (+, -, *, /, %). Также целочисленные типы предоставляют ряд итераторов:
1 2 3 4 5 6 7 8 9 | |
Массивы и хэши
В Ruby для коллекций объектов существуют объекты классов Array (массив) и Hash (хэш). Они отличаются друг от друга индексацией элементов: в массивах объекты индексируются последовательными целыми числами, а в хэшах ключом элемента может быть любой объект.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Для обхода элементов массива или хэша используются итераторы, например each:
1 2 3 4 5 6 7 8 | |
Классы
Как я уже писал чуть выше, каждый объект относится к определенному классу. Узнать этот класс можно с помощью метода class:
1 2 | |
Попробуем написать свой элементарный класс:
1 2 3 | |
и создать объект этого класса:
1 2 | |
Создание объекта происходит посредством вызова метода new того класса, к которому будет относиться создаваемый объект.
Основное предназначение класса - это определение поведения его объектов, то есть методов. Напишем какой-нибудь метод:
1 2 3 4 5 6 | |
и вызовем его, предварительно создав объект:
1 2 3 4 | |
Наш метод просто возвращает строку “hello!”, а irb выводит результат каждой возвращающей что-либо строки кода; поэтому при вызове метода мы видим возвращаемую строку.
Тут необходимо сделать небольшое отступление - Ruby позволяет открывать уже определенные классы, и определять новые методы, так же как и переопределять уже существующие. Это дает возможность применять технику, известную как monkeypatching - изменение методов встроенных (либо добавляемых какой-нибудь сторонней библиотекой) классов, чтобы получить метод, ведущий себя немного не так, как задумывалось автором, но не переписывать для этого слишком многое.
Переменные
Переменные в Ruby различаются на несколько типов по своему названию:
- $global - переменные, название которых начинается с $, являются глобальными и доступны в любой области видимости
- @@class - переменные, название которых начинается с @@, являются классовыми и доступны в контексте класса, к которому они принадлежат, а также в контексте классов-наследников
- @object - переменные, название которых начинается с @, являются переменными объекта (инстанса) и доступны в контексте этого объекта
- local - прочие переменные являются локальными, и выпадают из области видимости при первой же смене контекста (например, если локальная переменная была объявлена в теле определения метода, то вне этого определения она будет уже недоступна)
Блоки
Блок - это кусок кода, который может иметь какие-то параметры, и возвращает определенное значение. Во многом блоки похожи на методы, но они не используются независимо - блок можно только передать методу.
При вызове метода ему можно передавать аргументы, а также блок. Для этого предусмотрено два варианта синтаксиса:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Как видно из примера, результат применения обоих вариантов одинаковый; но синтаксис с использованием фигурных скобок принято применять в случаях, когда блок содержит всего одну строку кода, а синтаксис do ... end - для многострочных блоков.
Код, переданный в блоке, будет выполняться в зависимости от метода определенное количество раз (итераторы), при определенных условиях (условные конструкции), и не только - блоки в Ruby находят достаточно широкое применение.
Чтобы метод выполнил код блока, служит ключевое слово yield - при выполнении метода в этом месте будет выполнен код блока:
1 2 3 4 5 6 7 | |
Если у блока предполагаются параметры, их нужно передавать параметрами в yield:
1 2 3 4 5 6 7 | |
Запуск ruby-скриптов
Разумеется, программирование на Ruby не ограничивается irb - можно создавать скрипты (общепринятое расширение для исходников скриптов на Ruby - .rb) и запускать из командной строки:
1 2 3 | |
Заключение
Разумеется, в одной статье невозможно охватить все грани языка, но надеюсь, что смог описать основы в относительно понятном виде. В следующей части будут описаны модули, наследование классов, примеси (mixin-ы), контроль доступа к методам (public/protected/private), гибкие возможности списков аргументов у методов и, возможно, что-нибудь еще.