std.string
Модуль строковых операций. За исключением format, все функции принимают аргументы по неизменяемой ссылке (&String); исходная строка остаётся доступной после вызова.
Все функции при несоответствии типов аргументов вырождаются в семантику пустой строки (а не сообщают об ошибке): split/trim/upper и т.п. рассматривают аргументы, не являющиеся String, как "". Это означает, что неверный тип аргумента не прервёт выполнение, но и не даст ожидаемого результата — рекомендуется полагаться на проверку типов в компиляторе, чтобы отловить такие случаи на этапе компиляции.
use std.stringСписок функций
| Функция | Сигнатура |
|---|---|
split | (s: &String, sep: &String) -> Vec(String) |
trim | (s: &String) -> String |
upper | (s: &String) -> String |
lower | (s: &String) -> String |
replace | (s: &String, old: &String, new: &String) -> String |
contains | (s: &String, sub: &String) -> Bool |
starts_with | (s: &String, prefix: &String) -> Bool |
ends_with | (s: &String, suffix: &String) -> Bool |
index_of | (s: &String, sub: &String) -> Int |
substring | (s: &String, start: Int, end: Int) -> String |
is_empty | (s: &String) -> Bool |
len | (s: &String) -> Int |
chars | (s: &String) -> Vec(String) |
concat | (s1: &String, s2: &String) -> String |
repeat | (s: &String, n: Int) -> String |
reverse | (s: &String) -> String |
format | (format: &String, ...args) -> String |
parse_int | (s: &String) -> Result(Int, Error) |
parse_float | (s: &String) -> Result(Float, Error) |
Функции
split
split: (s: &String, sep: &String) -> Vec(String)Разбивает s по sep и возвращает список подстрок.
s— разбиваемая строкаsep— разделитель; если пустая строка — разбивает посимвольно
Возвращает: List(String). Если разделитель не найден, возвращается список из одного элемента.
use std.assert
use std.list
use std.string
main: () -> Void = {
parts = string.split("a,b,c", ",")
assert(list.len(parts) == 3)
assert(list.get(parts, 0) == "a")
// 空分隔符 → 逐字符
cs = string.split("abc", "")
assert(list.len(cs) == 3)
}trim
trim: (s: &String) -> StringУдаляет начальные и конечные пробельные символы Unicode.
Возвращает: новую строку без начальных и конечных пробелов (без изменения s).
use std.assert
use std.string
main: () -> Void = {
assert(string.trim(" hi ") == "hi")
}upper
upper: (s: &String) -> StringПреобразует в верхний регистр (с учётом Unicode).
use std.assert
use std.string
main: () -> Void = {
assert(string.upper("abc") == "ABC")
}lower
lower: (s: &String) -> StringПреобразует в нижний регистр (с учётом Unicode).
use std.assert
use std.string
main: () -> Void = {
assert(string.lower("ABC") == "abc")
}replace
replace: (s: &String, old: &String, new: &String) -> StringЗаменяет все вхождения old в s на new.
old— если пустая строка, возвращаетsбез изменений (без вставок)
use std.assert
use std.string
main: () -> Void = {
assert(string.replace("a-b-c", "-", "+") == "a+b+c")
assert(string.replace("abc", "", "x") == "abc")
}contains
contains: (s: &String, sub: &String) -> BoolВстречается ли sub в s. Для пустой подстроки всегда true.
use std.assert
use std.string
main: () -> Void = {
assert(string.contains("hello", "ell"))
assert(!string.contains("hello", "xyz"))
}starts_with
starts_with: (s: &String, prefix: &String) -> BoolНачинается ли s с prefix. Для пустого prefix всегда true.
use std.assert
use std.string
main: () -> Void = {
assert(string.starts_with("hello", "he"))
}ends_with
ends_with: (s: &String, suffix: &String) -> BoolЗаканчивается ли s на suffix. Для пустого suffix всегда true.
use std.assert
use std.string
main: () -> Void = {
assert(string.ends_with("hello", "lo"))
}index_of
index_of: (s: &String, sub: &String) -> IntБайтовый индекс первого вхождения sub.
Возвращает: при нахождении — индекс; при отсутствии — -1.
Возвращается байтовое смещение. Для строк с многобайтовыми символами можно сначала преобразовать через
chars, а затем искать индекс символа.
use std.assert
use std.string
main: () -> Void = {
assert(string.index_of("hello", "ll") == 2)
assert(string.index_of("hello", "xyz") == -1)
}substring
substring: (s: &String, start: Int, end: Int) -> StringИзвлекает подстроку по символьным индексам в диапазоне [start, end).
start— начальный символьный индекс, по умолчанию0end— конечный символьный индекс (не включая), по умолчанию — конец строки
Возвращает: результат среза. Выходящие за границы индексы фиксируются в допустимом диапазоне без ошибки; при start > end фиксируется как пустая строка.
use std.assert
use std.string
main: () -> Void = {
assert(string.substring("hello", 1, 4) == "ell")
assert(string.substring("hello", 1, 99) == "ello") // 上界钳制
}is_empty
is_empty: (s: &String) -> BoolЯвляется ли s пустой строкой.
use std.assert
use std.string
main: () -> Void = {
assert(string.is_empty(""))
assert(!string.is_empty("x"))
}len
len: (s: &String) -> IntВозвращает длину в байтах UTF-8, а не количество символов.
use std.assert
use std.string
main: () -> Void = {
assert(string.len("hello") == 5)
assert(string.len("中") == 3) // 字节长度
}chars
chars: (s: &String) -> Vec(String)Разбивает на список односимвольных строк (по скалярным значениям Unicode).
use std.assert
use std.list
use std.string
main: () -> Void = {
cs = string.chars("ab")
assert(list.len(cs) == 2)
assert(cs[0] == "a")
}concat
concat: (s1: &String, s2: &String) -> StringСцепляет две строки. Также можно использовать оператор +.
use std.assert
use std.string
main: () -> Void = {
assert(string.concat("a", "b") == "ab")
}repeat
repeat: (s: &String, n: Int) -> StringПовторяет s n раз.
n— количество повторений; приn <= 0возвращается пустая строка
use std.assert
use std.string
main: () -> Void = {
assert(string.repeat("ab", 3) == "ababab")
assert(string.repeat("ab", 0) == "")
}reverse
reverse: (s: &String) -> StringПереворачивает строку посимвольно.
use std.assert
use std.string
main: () -> Void = {
assert(string.reverse("abc") == "cba")
}format
format: (format: &String, ...args) -> StringФорматирует с использованием плейсхолдеров {index} с необязательными спецификаторами ширины/выравнивания.
Синтаксис плейсхолдеров:
| Форма | Значение |
|---|---|
{0} | 0-й аргумент (аргументы после format нумеруются с 0) |
{0:03} | ширина 3 |
{0:>3} | ширина 3, выравнивание по правому краю (по умолчанию) |
{0:<3} | ширина 3, выравнивание по левому краю |
{0:^3} | ширина 3, выравнивание по центру |
Литеральная фигурная скобка обозначается удвоением: две открывающие фигурные скобки дают одну литеральную открывающую, и аналогично для закрывающих.
Возвращает: форматированную строку. Аргументы сначала преобразуются в строки (аналогично convert.to_string); при выходе индекса за границы подставляется пустая строка, недопустимая ширина обрабатывается как 0.
use std.assert
use std.string
main: () -> Void = {
assert(string.format("{0}-{1}", "a", "b") == "a-b")
assert(string.format("[{0:>5}]", "ab") == "[ ab]")
assert(string.format("[{0:<5}]", "ab") == "[ab ]")
}parse_int
parse_int: (s: &String) -> Result(Int, Error)Разбирает десятичное целое число (автоматически удаляет начальные и конечные пробелы).
Возвращает: при успехе — Result.ok(Int); при неудаче — Result.err(Error) с code равным E6010. Ошибка не выбрасывается.
use std.assert
use std.result
use std.string
main: () -> Void = {
assert(result.is_ok(string.parse_int("42")))
assert(result.is_err(string.parse_int("abc")))
}parse_float
parse_float: (s: &String) -> Result(Float, Error)Разбирает число с плавающей точкой (автоматически удаляет начальные и конечные пробелы).
Возвращает: при успехе — Result.ok(Float); при неудаче — Result.err(Error) с code равным E6011.
use std.assert
use std.result
use std.string
main: () -> Void = {
assert(result.is_ok(string.parse_float("3.14")))
assert(result.is_err(string.parse_float("xxx")))
}См. также
std.convert— преобразование чисел в строкуstd.result— распаковка результатовparse_*
