В Verse тип string
используется для хранения и обработки текста, например "Привет, Verse"
и "Epic Games"
. В Verse строка может содержать буквы, цифры, знаки препинания, пробелы и эмодзи. Строка, не содержащая символов, называется пустой строкой и выглядит как ""
.
Вы можете включать предопределённые строковые значения в код в качестве литералов. Строковый литерал — это последовательность символов в коде, заключённая в двойные кавычки " "
.
Ниже приведён пример создания строковой переменной с именем Hello
инициализированной строковым литералом "Привет, мир"
:
Hello : string = "Привет, мир"
Кодирование символов
Кодирование символов — это сопоставление между текстовым символом и данными, которые может понять компьютер, называемыми кодовой точкой.
В Verse используется схема кодирования символов UTF-8 Unicode — стандарт, разработанный Unicode Consortium для обеспечения сопоставимой поддержки символов на разных языках, платформах и устройствах.
Например, эмодзи в этой строке "🐈"
может быть также представлен кодовой точкой Unicode "{0u1f408}"
. Полный список символов, поддерживаемых в Unicode, и соответствующие им кодовые точки можно найти в документации Unicode.
Единица кода UTF-8 — это 8 бит (один байт), и согласно этому стандарту символы кодируются кодовыми точками длиной от одного до четырёх байт. Для кодовых точек с меньшим значением используется меньше байт, чем для кодовых точек с большим значением. Например, для "a"
используется один байт "{0c61}"
, а для "á"
— два байта "{0cC3}{0cA1}"
.
Строковые операции
Строки поддерживают объединение, сравнение, индексацию, получение длины строки и интерполяцию.
Объединение
Объединение — это добавление одной строки к другой строке. Для конкатенации строк можно использовать оператор +
.
Например, в результате выполнения следующего кода переменная Announcement
будет содержать строку "…И победителем становится… первый игрок!"
.
# Имя победившего игрока:
WinningPlayerName : string = "Игрок 1"
# Создадим сообщение, объявляющее победителя.
Announcement : string = "…И победителем становится… " + WinningPlayerName + "!"
Интерполяция строк
Вы можете передать значение в строку, если в текущей области видимости определена действительная функция ToString()
.
Например, в результате выполнения следующего кода переменная Announcement
будет содержать строку "…И победителем становится… первый игрок!"
.
# Имя победившего игрока:
WinningPlayerName : string = "Игрок 1"
# Создадим сообщение, объявляющее победителя.
Announcement : string = "…И победителем становится… {WinningPlayerName}!"
Сравнение
Равенство двух строк зависит от того, используются ли в них одинаковые символы.
Сравнение строк в Verse осуществляется путём сравнения кодовых точек каждого символа. Сравнение двух строк чувствительно к регистру, поскольку прописные и строчные символы имеют разные кодовые точки.
Вы можете использовать операторы, допускающие неоднозначность =
или <>
, чтобы проверить две строки на равенство или неравенство, соответственно.
В Unicode существует несколько способов представления одного и того же символа. Например, "é"
— это "{0u0049}"
, но также можно использовать две кодовые точки: "{0u0065}"
, соответствующую "e"
, и "{0u0301}"
, являющуюся добавленным диакритическим знаком. Так, если сравнить данные строки, они не будут равны при том, что обе являются символом "é"
, но в них используются разные кодовые точки. Получаем, что "{0u0049}"
не равно "{0u0065}{0u0301}"
.
В следующем примере проверяется, использовал ли игрок нужный предмет для продвижения в приключении/головоломке:
# Это предмет, который требуется для разблокировки следующего шага головоломки:
ExpectedItemInternalName : string = "RedPotion"
# Это предмет, который выбрал игрок:
SelectedItemInternalName : string = "BluePotion"
# Проверим, выбрал ли игрок нужный предмет.
if (SelectedItemInternalName = ExpectedItemInternalName):
# Да! Сообщим, что можно переходить на следующий шаг головоломки.
return true
# Нет. Сообщим, что этот элемент не позволяет продвинуться в решении головоломки.
return false
Длина
Вы можете получить количество единиц кода UTF-8 в строке, обратившись к строке через составляюущю Length
. Например, "hey".Length
равно 3
.
Длина строки — это количество элементов данных, необходимых для представления строки в единицах кода UTF-8. Например, "héy".Length
равно 4
, потому что для представления символа é
требуется дополнительная единица кода UTF-8, хотя в строке три символа. Следующий код отображает таймер секунд с двумя цифрами. При необходимости на дисплее отображается ноль в первой позиции.
# Предполагается, что значение SecondsRemaining неотрицательное
SecondsRemaining : int = 30
# Автоматически преобразуем значение int в string:
SecondsString:string = SecondsRemaining
# Создадим строку отображения таймера.
var Combined : string = "Оставшееся время: "
# Если строка слишком длинная, заменим её максимальным двухзначным значением 99.
if (SecondsString.Length > 2):
# Слишком большое время на часах! Присвоим строке жёстко заданное максимальное значение.
set Combined += "99"
else if (SecondsString.Length < 2):
# Запишем ноль в первую позицию на дисплее.
set Combined += "0{SecondsString}"
else:
# Строка уже имеет требуемую длину, поэтому добавим её.
set Combined += SecondsString
Индекс
Вы можете получить доступ к единице кода UTF-8 по определённому индексу строки. Первая единица кода UTF-8 в строке имеет индекс 0, а индекс каждой последующей единицы кода увеличивается на единицу.
Например, "cat"[0]
— это"c"
, а "cat"[1]
— это "a"
.
Индекс | 0 | 1 | 2 |
Символ | "c" |
"a" |
"t" |
Единица кода | "{0c63}" |
"{0c61}" |
"{0c74}" |
Если в строке есть символы, которые представлены более чем одной единицей кода, каждая единица кода имеет собственный индекс. Например, "á"
представлена двумя единицами кода UTF-8 "{0cC3}{0cA1}"
, поэтому "cát"[1]
— это "{0cC3}"
, а "cát"[2]
— это "{0cA1}"
.
Индекс | 0 | 1 | 2 | 3 |
Символ | "c" |
"á" |
"t" |
|
Единица кода | "{0c63}" |
"{0cC3}" |
"{0cA1}" |
"{0c74}" |
Последний индекс строки на единицу меньше длины строки. Так, если "cat".Length
— это 3
, то у "t"
в "cat"
индекс равен 2
.
Стандартная библиотека
Стандартная библиотека предоставляет доступ к функциям, помогающим создавать и использовать строки. Более подробную информацию об этих функциях см. в Справочнике по API Verse.
Альтернативные представления символов
Некоторые символы имеют альтернативные представления, когда они используются в строке. Например, скобки "{}"
можно использовать для интерполяции строки или для кодовых точек символов. При этом их можно использовать и просто для обозначения символов скобок {}
в тексте.
Чтобы использовать альтернативное представление символа в строке, нужно добавить управляющий символ "\"
перед символом в строке. Например, "\{\}"
отображается в тексте как {}, а "\n"
вызывает перевод текста на новую строку.
Подробнее о реализации
Тип string
является псевдонимом типа []char
, массивом единиц кода UTF-8. Поскольку строка является псевдонимом типа массива, строка ведёт себя подобно массиву.
Существует два примитивных типа символов, отличающихся размером и форматом кодовой точки, — char
и char32
. Единственные операции, возможные для char
и char32
в языке Verse — это сравнение и обращение к их значениям.
Примитивный тип | Описание | Поддерживаемые форматы |
---|---|---|
char | Примитивный тип, представляющий одну единицу кода UTF-8 (один байт), с максимальным значением 256 (0off ). |
Единицы кода имеют вид 0oXX. Например: 0o52 . |
char32 | Примитивный тип, представляющий кодовую точку Unicode. | Кодовые точки имеют вид 0uXXXX . Например: 0u0041 . |
Можно также выражать литералы с помощью одинарных кавычек. Примитивный тип строки в одинарных кавычках может быть char
или char32
в зависимости от единиц кода UTF-8 символа. Так, 'e'
имеет тип char
, а 'é'
— char32
.
Сохраняемый тип
Значения типа string
, char
и char32
являются сохраняемыми. Это означает, что вы можете использовать их в переменных weak_map
, входящих в область видимости модуля, и их значения будут сохраняться в течение всех игровых сессий. Подробнее о сохраняемых элементах в Verse см. в статье Использование сохраняемых данных в Verse.