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

Для проверки условия ИЛИ используйте оператор ||.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе
Упражнение доступно только авторизованным пользователям.

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