В 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.