Урок 3: «Кодим на Ruby»
Этот урок можно назвать заключительным в ознакомлении с базисом Ruby. На следующий уроках мы уже будем с вами писать свои скрипты. Тем не менее, советую все же прочитать и этот урок.
Итак, мы уже с вами знаем, что Ruby объектно-ориентированный язык, по своей свободе более схожий с Perl, нежели с Python, от которого создатель языка и отталкивался. В прошлом уроке я привел правила именования переменных, без которых вы просто не сможете читать чужие исходники и сами напишете абракадабру.
Давайте теперь белее углубленно коснемся этот язык. Так как он интерпретируемый, то, естественно, обладает мягкой типизацией. Об этом я говорил и раньше, поэтому затрагивать данный вопрос не буду. Тем не менее, несмотря на то, что переменные в Ruby не имеют тип, объекты, на которые они ссылаются этот тип имеют. Если вам не совсем понятно, что такое тип данных и для чего он нужен, прочтите мой урок 2 по C++.
Мы уже разобрались с тем, что в Ruby все же имеются типы данных. Самые простейшие из них – это число, символ и строка.
Применение этих типов схоже с применением в других языках, если вы уже имеете опыт программирования. Еслиу вас такого опыта нет, то чтобы сто раз не писать одно и тоже, отправлю вас к прочтение вышеупомянутого урока 2 по C++.
Давайте будет считать, что вы прекрасно понимаете, что такое числовая переменная и строковая. С числовыми переменными вообще все очень просто. Давайте рассмотрим простой пример умножения двух чисел:
a=34 b=12 puts a*b # выдаст на экран 408
Как видите, все очень просто. Я вывел значение произведения в функции puts. Так же я мог объявить третью переменную c и присвоить ей значение произведения.
Более подробно работу с числовыми типами, равно как и со строками, мы будем рассматривать в других уроках. Просто пока вы еще теоретически не готовы к сложным приемам.
С числами все очень просто. Но вот со строками новички иногда путаются. В принципе, ничего сложно в использовании строк нет, однако здесь есть маленький нюанс, доставшийся Ruby от Perl – есть интерпретируемые строки и экранированные.
Что такое интерпретируемая строка? Это строка, в которую вы можете включить переменную и Ruby выдаст значение такой переменной в этой строке. Заключается подобная строка в двойные кавычки. Давайте рассмотрим это на примере:
value=234 string=” Вы ввели значение #{value}” puts string
Запустите этот код и посмотрите, что он выдаст. Обратите внимание, что переменная value должна быть заключена в фигурные скобки и предварена символом #, иначе интерполяция переменной не произойдет, как в том же Perl. Если вы не поставите # перед переменной, то все будет простым текстом.
Ruby в этом плане несколько интеллектуальнее своих предшественников. Тем не менее, часто нужно ввести строку такой, как она есть. То есть, в нашем примере мы вывели значение value на консоль. А вдруг вам нужно вывести строку так, как она записана:
puts ‘Для интерпретации переменной в строке используется синтаксис #{value}’
Запустите этот скрипт у себя и посмотрите разницу. Если вы читали внимательно код, то наверняка обратили внимание на то, что строка заключена в одинарные кавычки (апострофы). Это делается для того, чтобы строка понималась Ruby буквально. Такие строки и являются экранированными.
Это особенно актуально при использовании регулярных выражений, о которых мы также поговорим в отдельном уроке. Пока вы должны понимать эту разницу.
Что касается символов, то они в заключаются в одинарные кавычки.
Я уже наверняка надоел вам тем, что постоянно привожу аналогии с Perl. Тем не менее, Ruby очень похож на него и мне легко было перейти с Perl на него, чем на тот же Python. Как и в Perl, здесь есть такие объекты как массивы и хэши, которые также называют ассоциативные массивы.
Более подробно о массивах вы можете прочитать в «уроке 5: Массивы» из рубрики по C++. Пусть вас не смущает тот факт, что я ссылаюсь на свои уроки по C++ — многие моменты даже в самых различных языках схожи. В том уроке вам просто важно понять, что такое массив.
Здесь же я скажу, что массив – это не более, чем набор однотипных данных. Вместо того, чтобы захламлять исходник множеством переменных, логичнее их объединить в массив. Тем не менее, массивы являются темой отдельного урока, так как многие приемы работы с ними характерные именно для Ruby. Однако в качестве такого вводного пояснения скажу, что массивы в Ruby заключаются в квадратные скобки и начинают свой отчет с 0. Давайте приведу пример с днем недели:
Day=[“Пн”,” Вт”,” Ср”,” Чт”,” Пт”, “Сб”,” Вс”] print Day[1]
Здесь я использовал еще одну функцию для вывода на консоль –print. Зацикливаться на ней я пока не буду, скажу лишь, что главное отличие print от puts заключается в том, что последняя переводит каретку на новую строку. Более подробно мы об этом поговорим, изучая подпрограммы.
Как видите, я объявил массив строк, где каждое значение отделено друг от друга запятой. Я мог бы объявить массив чисел или объектов –неважно. Главное, чтобы вы не пугались такой конструкции, если вдруг в других уроках я начну использовать массивы. В любом случае, массивы в Ruby тема достаточно обширная и поэтому ради нее стоит посвятить целый урок.
Хэши или ассоцативные массивы ставят новичков в тупик. Тем не менее, это достаточно удобный инструмент, который я часто вижу в других языках. Однако в силу сложности понимания данного понятия, оставлю хэши на очередной урок.
Тем не менее, для тех, кто хочет самостоятельно изучить этот язык, скажу, что хэш – это набор ключ-значение. По сути, это массив, каждому элементу которого соответствует некий индентификатор или значение.
Пока на этом по типам данным в Ruby мы закончим. Теперь давайте рассмотрим основные операторы и их приоритет.
Основные операторы в Ruby
Любой язык программирования не обходится без операторов. Иногда они похожи между собой (логично, что плюс, минус и тому подобное должны быть в любом языке), но чаще имеют свою специфику. Я приведу таблицу, в которой опишу основные операторы и их приоритет в порядке возрастания:
and or | Логическое и, или (имеет самый низкий приоритет) |
not | Логическое отрицание |
?: | Тернарный оператор |
= (также +=, -= и т.д) | Присваивание |
.. … | Операторы диапазона |
|| | Логическое или |
&& | Логическое И |
==, ===,<=>,!=,=~,!~ | Равенство, неравенство |
>, >=, <, <= | Операторы сравнения болье или равно, меньше или равно |
| , ^ | Битовое ИЛИ, Битовое исключающее ИЛИ |
& | Битовое И |
<<, >> | Сдвиги |
+, — | Сложение, вычитание |
*,/,% | Умножение, деление, остаток от деления |
** | Возведение в степень |
[] | Взятие индекса |
:: | Квантификатор, разрешающий область видимости |
Многие операторы имеют двоякий смысл. Например, можно побитово сдвинуть число оператором <<, но этот же оператор используется для добавления в конец массива, строки и т.п. Кроме того, вы могли заметить, что у некоторых операторов есть мнемонические аналоги, которые имеют более низкий приоритет. Несмотря на то, что в Ruby они есть, их все же не рекомендую использовать в силу того, что скрипт существенно замедляется.
Теперь вы знаете много о типах данных и имеете представление об основных операторах. Пока отдохните десять минут, чтобы реализовать все эти знания в большом практикуме по Ruby.