переменных, им нельзя впоследствии присвоить другое значение. К константам можно получить доступ и использовать их в выражениях вместо их значений. Они полезны при присвоении имен специальным или повторяющимся значениям. Они могут хранить любые данные, а не только числа.
Теперь давайте рассмотрим некоторые из наиболее распространенных примитивных типов данных.
Как и в других языках, числа бывают разных видов; вот таблица с их описанием:
Таблица 2.1 – Виды чисел и их пределы
При записи числа в соответствии со значением будет использоваться наиболее подходящий тип: если это целое число, то это будет Int32
, Int64
или UInt64
, в зависимости от того, что наиболее подходит. Если это значение с плавающей запятой, оно всегда будет Float64
. Вы также можете добавить суффикс, чтобы указать один конкретный тип. Наконец, для улучшения читаемости можно свободно использовать символы подчеркивания. Вот несколько примеров того, как можно выразить числа:
small_number = 47 # Это тип Int32
larger_number = 8795656243 # Теперь это тип Int64
very_compact_number = 47u8 # Тип UInt8 из-за суффикса
other_number = 1_234_000 # Это то же самое, что 1234000
negative_number = -17 # Есть и отрицательные значения
invalid_number = 547_u8 # 547 не соответствует диапазону UInt8
pi = 3.141592653589 # Дробные числа имеют формат Float64
imprecise_pi = 3.14159_f32 # Это Float32
Как и ожидалось, вы также можете выполнять математические операции с числами. В большинстве языков это работает аналогично математике. Операторов много, и их можно переставлять в зависимости от их приоритета. В любом случае круглые скобки могут помочь организовать более крупное выражение. Давайте посмотрим пример:
hero_health_points = 100
hero_defense = 7
enemy_attack = 16
damage = enemy_attack - hero_defense # Враг наносит 9 единиц урона
hero_health_points -= damage # Теперь здоровье героя составляет 91
healing_factor = 0.05 # Герой исцеляется со скоростью 5% за ход
recovered_health = hero_health_points * healing_factor
hero_health_points += recovered_health # Теперь здоровье 95,55
# Этот же расчет можно выполнить и в одну строку: result = (100 - (16 - 7)) * (1 + 0.05) # => 95.55
Вот некоторые из наиболее распространенных операций с числами:
Таблица 2.2 – Операции, применимые к числам
Существуют и другие типы чисел для выражения больших или более точных величин:
• BigInt
: произвольно большое целое число.
• BigFloat
: произвольно большие числа с плавающей запятой.
• BigDecimal
: точные и произвольные числа по основанию 10, особенно полезно для валют.
• BigRational
: выражает числа в виде числителя и знаменателя.
• Complex
: содержит число с действительной и мнимой частью.
Все они действуют как числа и имеют функциональность, аналогичную целым числам и числам с плавающей запятой, которые мы уже представили.
Примитивные константы — true, false и nil
В Crystal есть три примитивные константы, каждая из которых имеет свое значение. Ниже указаны типы и использование:
Таблица 2.3 – Примитивные константы и описания
Значения true и false являются результатом выражений сравнения и могут использоваться с условными выражениями. Несколько условных операторов можно комбинировать с помощью &&
(и) или ||
(или) символы. Например, 3 > 5 || 1 < 2
оценивается как true
.
Не все данные состоят только из чисел; нам часто приходится иметь дело с текстовыми данными. Давайте посмотрим, как мы можем с ними справиться.
Строки и символы (String и Char)
Текстовые данные могут быть представлены типом String: они могут хранить произвольные объемы текста UTF-8, предоставляя множество служебных методов для его обработки и преобразования. Существует также тип Char
, способный хранить одну кодовую точку Юникода: character. Строки выражаются с помощью текста в двойных кавычках, а символы — с одинарными кавычками:
text = "Crystal is cool!"
name = "John"
single_letter = 'X'
kana = 'あ' # Международные символы всегда действительны
Внутри строки вы можете использовать интерполяцию для внедрения в текст других значений. Это полезно для создания строки из данных в других переменных. Хотя вы можете интерполировать любое выражение, постарайтесь сделать его простым. Вот несколько примеров того, как это делается:
name = "John"
age = 37
msg = "#{name} is #{age} years old" # То же, что и "Джону 37 лет"
Вы также можете использовать escape-последовательности внутри строки для обозначения некоторых специальных символов. Например, команда puts "anbnc”
покажет три строки вывода. Они заключаются в следующем:
Таблица 2.4 – Специальные escape-последовательности внутри строк или символов
Важно помнить, что строки Crystal являются неизменяемыми после их создания, поэтому любая операция над ними приведет к созданию новой строки. Многие операции можно выполнять со строками; они будут использоваться в примерах на протяжении всей книги. Вот некоторые распространенные операции, которые можно выполнять со строками:
Таблица 2.5 – Общие операции над строковыми значениями
Строки и числа являются обычным представлением большинства данных, но есть еще несколько структур, которые мы можем изучить, чтобы облегчить понимание данных.
Еще один полезный тип данных — Range
; это позволяет представлять интервал значений. Используйте две или три точки, разделяющие значения:
• a..b
обозначает интервал, начинающийся с a
и заканчивающийся буквой b
включительно.
• a...b
обозначает интервал, начинающийся с a
и заканчивающийся непосредственно перед b
, исключая его.
Ниже приведены примеры диапазонов:
1..5 # => 1, 2, 3, 4, и 5.
1...5 # => 1, 2, 3, и 4.
1.0...4.0 # => Включает 3,9 и 3,999999, но не 4.
'a'..'z' # => Все буквы алфавита
"aa".."zz" # => Все комбинации двух букв
Вы также можете опустить начало или конец, чтобы создать открытый диапазон. Вот некоторые примеры:
1.. # => Все числа больше 1
...0 # => Отрицательные числа, кроме нуля
.. # => Ассортимент, который включает в себя все, даже самого себя