Выбрать главу

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 "a\nb\nc” покажет три строки вывода. Они заключаются в следующем:

Таблица 2.4 – Специальные escape-последовательности внутри строк или символов

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

Таблица 2.5 – Общие операции над строковыми значениями

Строки и числа являются обычным представлением большинства данных, но есть еще несколько структур, которые мы можем изучить, чтобы облегчить понимание данных.

Диапазоны (Ranges)

Еще один полезный тип данных — 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 # => Отрицательные числа, кроме нуля

.. # => Ассортимент, который включает в себя все, даже самого себя

Диапазоны также можно применять к разным типам; подумайте, например, о временных интервалах.

С диапазонами можно выполнять множество операций. В частности, Range реализует как Enumerable, так и Iterable, что позволяет ему действовать как сбор данных. Вот несколько служебных методов: