Вы также можете использовать 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?
методы можно использовать для проверки других типов.