Эта статья посвящается моим друзьям/знакомым 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
), гибкие возможности списков аргументов у методов и, возможно, что-нибудь еще.