Вы также можете использовать escape-последовательности внутри строки для обозначения некоторых специальных символов. Например, команда puts "a\nb\nc”
покажет три строки вывода. Они заключаются в следующем:
Важно помнить, что строки Crystal являются неизменяемыми после их создания, поэтому любая операция над ними приведет к созданию новой строки. Многие операции можно выполнять со строками; они будут использоваться в примерах на протяжении всей книги. Вот некоторые распространенные операции, которые можно выполнять со строками:
Строки и числа являются обычным представлением большинства данных, но есть еще несколько структур, которые мы можем изучить, чтобы облегчить понимание данных.
Диапазоны (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
, что позволяет ему действовать как сбор данных. Вот несколько служебных методов:
Вы уже можете выражать некоторые данные, используя литеральные значения и переменные в своем коде. Этого достаточно для некоторых базовых вычислений; попробуйте использовать его для некоторых преобразований строк или математических формул. Некоторые виды значений можно сначала объявить, чтобы использовать позже; перечисления — самые простые из них.
Перечисления и символы (Enums and symbols)
Строки используются для представления произвольного текста, обычно касающегося некоторого взаимодействия с пользователем, когда набор всех возможных текстов заранее неизвестен. String
предлагает операции по разрезанию, интерполяции и преобразованию текста. Бывают случаи, когда значение вообще не предназначено для манипуляций, а просто должно представлять одно состояние из некоторых известных возможностей.
Например, предположим, что вы взаимодействуете с каким-либо пользователем в многопользовательской системе. Этот конкретный пользователь может быть гостем, обычным пользователем, прошедшим проверку подлинности, или администратором. Каждый из них имеет разные возможности, и их следует различать. Это можно сделать с помощью числового кода для представления каждого типа пользователей, например 0, 1 и 2. Или это можно сделать с использованием типа String
, имеющего типы пользователей «гость», «обычный» и «администратор».
Лучшая альтернатива — объявить правильное перечисление возможных типов пользователей, используя ключевое слово enum
для создания совершенно нового типа данных. Давайте посмотрим синтаксис:
enum UserKind
Guest
Regular
Admin
end
Переменная, содержащая тип пользователя, может быть назначена путем ссылки на имя типа, а затем на один из объявленных типов:
user_kind = UserKind::Regular
puts "This user is of kind #{user_kind}"
Тип переменной user_kind
— UserKind
, точно так же, как тип 20 — Int32
. В следующей главе вы узнаете, как создавать более сложные пользовательские типы. Для каждой потребности могут быть созданы разные перечисления; они не будут смешиваться друг с другом.
Значение перечисления можно проверить с помощью метода, сгенерированного из каждой альтернативы. Вы можете использовать user_kind.guest?
чтобы проверить, содержит ли этот user_kind
тип Guest
или нет. Аналогично, regular?
и admin?
методы можно использовать для проверки других типов.