Строки¶
Работа со строками в ZScript представлена обширно, если сравнивать с ACS и Decorate. В нём есть и встроенная конкатенация, и разбиение на символы, и перевод строки в int или double, и сравнение без учёта регистра букв.
Тип: "String". По умолчанию инициализируется пустой строкой.
Строкой в ZScript называется набор символов, заключённый в двойные кавычки. В длине ограничен максимальным фрагментом нераспределённой памяти — на практике можно считать, что лимита нет.
Примеры:
Операции над строками¶
..: конкатенация (объединение) строк в одну.String.Format( String fmt, ... ): статический метод форматирования строки. См. "printf()" из стандарта C.==: прямое сравнение.~==: сравнение без учёта регистра.
Примеры:
String greek_a = "Alpha";
String greek_b = "Beta";
String concatted = greek_a .. " " .. greek_b; // "Alpha Beta".
String conc2 = "Hello " .. "world, hello " .. concatted .. "!"; // "Hello world, hello Alpha Beta!".
if ( concatted == "alpha beta" )
console.printf( "Lowercase." ) // Эта строка не выведется, так как строки не совпадают по регистру.
if ( concatted ~== "ALPHA bEta" )
console.printf( "Is alpha-beta." ); // А эта напишется, так как "~==" сравнивает без учёта регистра строк.
Нестатические методы¶
void Replace( String pattern, String replacement ): заменить все подстроки.String Left( int len ): вернуть часть символов с начала строки и доlen.String Mid( int pos = 0, int len = 2147483647 ): получить кусочек строки сposколичествомlen.void Truncate( int newlen ): обрезать строку (в отличие от "Left()", изменяет оригинал).void Remove( int index, int remlen ): удалитьremlenсимволов с позицииindex.String CharAt( int pos ): получить символ по указанной позиции.int CharCodeAt( int pos ): получить ACSII-код символа по указанной позиции.String Filter(): применить фильтр escape-последовательностей (см. ниже).int IndexOf( String substr, int startIndex = 0 ): найти первое вхождение подстроки в строку, начиная сstartIndex.int LastIndexOf( String substr, int endIndex = 2147483647 ): найти последнее вхождение подстроки в строку не дальшеendIndex.void ToUpper(),void MakeUpper(): изменить регистр всех букв в строке на верхний.void ToLower(),void MakeLower(): изменить регистр всех букв в строке на нижний.int ToInt( int base = 0 ): попытаться сконвертировать строку в типintс основанием системы счисленияbase.double ToDouble(): попытаться сконвертировать строку в типdouble.void Split( out Array<String> tokens, String delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY ): разбить строку по делителямdelimiter, поместив результат в массив строкtokens.
С не кодировками ANSI могут наблюдаться проблемы с позицией символов, так как тот же Unicode содержит символы нефиксированной байтовой длины.
Escape-последовательности¶
Практически совпадают со стандартом C.
- “
\n”: перевод на следующую строку. - “
\x##”: запись символа по его шестнадцатеричному представлению. - “
\o###”: запись символа по его восьмеричному представлению. - “
\c#”: изменение цвета последующих символов; вместо#должен быть любой из этих символов (тут должна быть ссылка на zdoom.org/wiki). - “
\c[цвет]”: изменение цвета последующих символов; вместоцветдолжно стоять название, объявленное в “x11r6rgb.txt”.
Для изменения цвета есть также строковые константы в классе Font — достаточно работать с ними как с обычными строками и, например, конкатенировать их с тем, с чем нужно:
const MsgCol = TEXTCOLOR_GRAY; // Основной цвет какой-то нашей надписи. Пусть серой будет.
const MsgSep = MsgCol .. ", "; // Оформленный разделитель, для удобства вынесенный в константу — запятая серого цвета.
console.printf( MsgCol .. "You must find " .. TEXTCOLOR_RED .. "scarlet-red" .. MsgSep .. TEXTCOLOR_CYAN .. "murky" .. MsgSep .. TEXTCOLOR_GOLD .. "gold" .. MsgCol .. " and " .. TEXTCOLOR_GREEN .. "forest" .. MsgCol .. " keys." );
Типы данных, похожие на строки¶
А также комментарии к ним.
-
Sound: узкоспециализированный тип строки: путь до звука, прописанный в lump SNDINFO. Автоконвертация String в Sound будет сделана там, где это надо; то есть вместо типа Sound практически всегда можно использовать обычный String. -
Name: технически являетсяuint, а не строкой, поэтому преобразовывать туда-обратно выйдет не всегда. -
StateLabel: название action-стейта (см. Actor). Противоречивый тип данных, так как конвертация возможна, но при определённых условиях. Произвольную строку в этот тип загрузить не удастся. -
TextureID: технически такжеuint, автоконвертацию можно провести только из него вString, но не наоборот. Для обратного преобразования см. [ссылка на статью], а также исходник "base.txt:TexMan.CheckForTexture()".