Ruby: Типы данных Ruby
Большая часть типов данных в Ruby работает аналогично типам в других языках. Это относится к строкам, числам или булевым значениям:
'one' # String
true # Boolean
false
3 # Integer
5.2 # Float
[] # Array
{} # Hash
1..3 # Range
Роль null
в ruby играет nil
. Такое название традиционно используется в Smalltalk и семействе Lisp-языков для обозначения концепции «ничего». В остальном всё очень похоже.
Тип Range используется для задания непрерывного диапазона чисел. Встречается не так часто, но бывает удобен, особенно при работе с датами в библиотеках.
# От сейчас до +24 часа
Time.now..(Time.now + 60 * 60 * 24)
Массивы в Ruby, как и в любом другом динамическом языке, тоже динамические. Их можно изменять, уменьшать и увеличивать прямо в процессе работы:
companies = []
# Добавление элемента
companies << 'hexlet'
Тип данных Hash хотя и называется необычно, по сути является обычным хранилищем key-value пар. В JavaScript для этого используются объекты, в PHP — ассоциативные массивы, а в Python — словари.
options = {
sanitize: true
}
options['table'] = false
Кроме стандартных типов Ruby добавляет довольно необычный тип, называемый символом. Подобный тип есть во многих языках, включая Erlang (атом), Clojure (кейворд) и JavaScript (символ). Пример:
:key
:anotherone
Символ очень похож на строку, но он представлен в памяти в единственном экземпляре — в отличие от строк, которые создаются каждый раз заново. Это если говорить про техническую сторону. На практике символ удобен там, где строка выражает саму себя. Обычно там, где в других языках создают константы, в которые записаны строки с именем этой константы, в Ruby просто используют символ. По большому счёту символ не является чем-то жизненно необходимым — он немного сокращает количество кода и местами чуть удобнее в использовании. В остальном по смыслу — это та же строка.
Символы — это такая концепция, которая «заходит» исключительно на практике. Чем больше примеров будет перед глазами, тем быстрее получится использовать этот тип по назначению.
Для проверки типа в каждом объекте присутствует метод is_a?
:
1.is_a? String # false
1.is_a? Integer # true
# Либо сам тип
1.class # Integer
'hexlet'.class # String
Задание
Реализуйте функцию type_of_type(value)
, которая определяет, является ли тип данных составным, и возвращает символ :complex
, если да, и :simple
— если нет. Составным считаются только три типа: Hash
, Array
и Range
. Остальные — простые.
type_of_type({}) # :complex
type_of_type('') # :simple
Для проверки условия ИЛИ используйте оператор ||
.
Не забудьте при этом поставить скобки вокруг вызова методов: 1.is_a?(String)
. Иначе код выполнится не так, как задумано, из-за приоритетов операций.
Упражнение не проходит проверку — что делать? 😶
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя 🤔
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно 🙄
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.