Ruby – Базовые типы данных

Недавно я начал изучать язык  Ruby и платформу Ruby on Rails. Первой статьей будет описание типов данных в Ruby.

Данные любого типа в Ruby суть объекты тех или иных классов. Самые используемые встроенные типы данных:

  • Fixnum (целые числа, меньшие 2^30),
  • Bignum (целые числа, большие 2^30),
  • Float (числа с плавающей запятой),
  • Array (массивы),
  • String (строки),
  • Hash (ассоциативные массивы).

Естественно, что это только базовые типы, но их вполне хватает для широкого спектра задач.

Числа в Ruby выглядят так:

5 # целое число
-12 # отрицательное целое число
4.5 # число с плавающей запятой
076 # восьмеричное число
0b010 # двоичное число
0x89 # шестнадцатиричное число

Не будем пока углубляться и мельком взглянем на другие типы данных.

Логический (булевый) тип — это вариация на тему «да» или «нет». В Ruby он представлен двумя предопределёнными переменными true («истина» или «да») и false («ложь» или «нет»). Появляется логический тип в результате логических операций или вызова логических методов.

Чаще всего логический тип возникает как результат сравнения.

Массивы

Разработчики Ruby решили не реализовывать особых классов для динамических массивов, списков, стеков и тому подобного. Они все это реализовали в массивах — структурах данных типа (или класса — в Ruby всё равно) Array. Сделано это путём добавления специальных методов; например, методы .push и .pop для стека. Особенности массивов в Ruby:

  • Нет ограничений (это общий принцип языка). Массивы могут быть сколь угодно длинными.
  • Динамичность: размер массива легко меняется.
  • Гетерогенность: один массив может хранить данные разных типов.
  • Библиотека итераторов на каждый случай жизни. Эта возможность позволяет не использовать циклов для обработки данных в массивах, а, следовательно, избегать множества ошибок, связанных с неосторожным обращением с циклами. Итераторы реализуются на высочайшем уровне.
  • Много других методов. Все элементарные задачи для массивов решаются вызовом нужного метода.

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

В мире поездов-гусениц счёт вагонов начинается с локомотива, а не со следующего за ним вагона. Таким образом локомотив — это как бы нулевой вагон.

Массивы кажутся странными с кавычками, но частенько бывают полезны при написании компьютерных программ. Возможно, вы даже поймёте, почему он ползёт всегда влево.

Строки

Стро́ки — это ряды букв и других символов. В Ruby стро́ки используют наработки языка Perl. Вот небольшой список их возможностей:

  • Нет ограничений. Длина строки́ может достигать поистине фантастических размеров.
  • Динамичность. Стро́ки можно расширять или уменьшать (для этого есть методы + и []).
  • Любой объект преобразуется в строку (методы .inspect и .to_s есть у любого объекта).
  • Строка обладает обширной библиотекой методов, которые работают с правилами (это методы .gsub, .match, .scan, .split).
Информация Правила — это новое название регулярных выражений. В текущей версии Ruby они называются регулярными выражениями, но давайте смотреть в будущее. Perl 6 уже не имеет понятия «регулярное выражение», заменив его «правилами» и «грамматиками».
  • Можно вставлять произвольный код на языке Ruby в строку. После выполнения код заместится результатом.

Стро́ки начинаются и заканчиваются " (программистскими кавычками) или ' (машинописным апострофом). Пример:

Стро́ки подобны массивам символов, поэтому их часто преобразуют к массивам, чтобы использовать богатый набор методов, а потом результат делают строкой.

Ассоциативные массивы

Ассоциативные массивы подобны массивам упорядоченных пар. Работают они подобно словарям: фигурная скобка символизирует боковой вид на открытую книгу, а стрелка => покажет читателю связь каждого одного с чем-то другим. Вторая фигурная скобка говорит, что пора закрывать книгу.

Но можно и без фигурных скобок, одной стрелкой:

Например:

Ассоциативные массивы оставляют возможность хранения данных разного типа только в ассоциативном виде.

Диапазоны значений

Чтобы было удобней получать подмассив или подстроку, был введён простенький тип данных — диапазон (класс Range). Диапазон формируется тремя элементами: начало, конец и тип протяжённости (символ .. или ...). Начало и конец должны быть одного типа данных (одного класса) и быть перечислимыми, что значит, иметь метод .succ. Пример диапазонов:

Диапазон-мотоцикл (..) проезжает от первого указанного объекта к его .succ (succedent — «последующему»), и до последнего включительно. Три точки — то же, но мотоцикл остановился прямо перед последним элементом. Ещё раз:

1..991...100

Объекты, имеющие .succ называют последовательными: этим методом можно по текущему элементу достоверно определить следующий.

Классы и объекты

Самодельные и неабстрактные составные типы данных называются классами. Если для вас это новость, то почитайте викиучебник об объектно-ориентированном программировании или статью в Википедии. Вообще, в Ruby всё в конечном счёте принадлежит классу Object.

Классы можно определять и создавать по ним объекты. Внутри класса может быть много всего интересного, и у него может быть фамильное дерево, то есть классы Ruby поддерживают наследование. Однако заметим, что множественное наследование в Ruby не разрешается. И ещё много всего интересного можно сделать с классами и объектами. Но об этом позже.

Ссылки:

http://ru.wikibooks.org/wiki/Ruby/%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D1%82%D0%B8%D0%BF%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

4 Comments

  1. опечатка в начале “Fixnum (целые числа, меньшие 230)”, там не 230 а 2 в 30-ой степени и далее тоже самое

  2. Андрей, скажите пожалуйста, Я следуя всем вашим рекомендациям по установке RoR и создания тестового приложения последовал и всё получилось, но когда начал делать другой прект на команду ruby script/generate он пишет No such file or directory — script/generate (LoadError)…..В чём может быть дело?

  3. “Нет ограничений (это общий принцип языка). Массивы могут быть сколь угодно длинными.”
    >ruby -e “Array.new(10**9,true)”
    Traceback (most recent call last):
    2: from -e:1:in '
    1: from -e:1:in
    new’
    -e:1:in `initialize’: array size too big (ArgumentError)

Leave a Comment