Skip to content

std.string ​

Модуль строковых операций. За исключением format, все функции принимают аргументы по неизменяемой ссылке (&String); исходная строка остаётся доступной после вызова.

Все функции при несоответствии типов аргументов вырождаются в семантику пустой строки (а не сообщают об ошибке): split/trim/upper и т.п. рассматривают аргументы, не являющиеся String, как "". Это означает, что неверный тип аргумента не прервёт выполнение, но и не даст ожидаемого результата — рекомендуется полагаться на проверку типов в компиляторе, чтобы отловить такие случаи на этапе компиляции.

yaoxiang
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 ​

yaoxiang
split: (s: &String, sep: &String) -> Vec(String)

Разбивает s по sep и возвращает список подстрок.

  • s — разбиваемая строка
  • sep — разделитель; если пустая строка — разбивает посимвольно

Возвращает: List(String). Если разделитель не найден, возвращается список из одного элемента.

yaoxiang
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 ​

yaoxiang
trim: (s: &String) -> String

Удаляет начальные и конечные пробельные символы Unicode.

Возвращает: новую строку без начальных и конечных пробелов (без изменения s).

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.trim("  hi  ") == "hi")
}

upper ​

yaoxiang
upper: (s: &String) -> String

Преобразует в верхний регистр (с учётом Unicode).

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.upper("abc") == "ABC")
}

lower ​

yaoxiang
lower: (s: &String) -> String

Преобразует в нижний регистр (с учётом Unicode).

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.lower("ABC") == "abc")
}

replace ​

yaoxiang
replace: (s: &String, old: &String, new: &String) -> String

Заменяет все вхождения old в s на new.

  • old — если пустая строка, возвращает s без изменений (без вставок)
yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.replace("a-b-c", "-", "+") == "a+b+c")
    assert(string.replace("abc", "", "x") == "abc")
}

contains ​

yaoxiang
contains: (s: &String, sub: &String) -> Bool

Встречается ли sub в s. Для пустой подстроки всегда true.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.contains("hello", "ell"))
    assert(!string.contains("hello", "xyz"))
}

starts_with ​

yaoxiang
starts_with: (s: &String, prefix: &String) -> Bool

Начинается ли s с prefix. Для пустого prefix всегда true.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.starts_with("hello", "he"))
}

ends_with ​

yaoxiang
ends_with: (s: &String, suffix: &String) -> Bool

Заканчивается ли s на suffix. Для пустого suffix всегда true.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.ends_with("hello", "lo"))
}

index_of ​

yaoxiang
index_of: (s: &String, sub: &String) -> Int

Байтовый индекс первого вхождения sub.

Возвращает: при нахождении — индекс; при отсутствии — -1.

Возвращается байтовое смещение. Для строк с многобайтовыми символами можно сначала преобразовать через chars, а затем искать индекс символа.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.index_of("hello", "ll") == 2)
    assert(string.index_of("hello", "xyz") == -1)
}

substring ​

yaoxiang
substring: (s: &String, start: Int, end: Int) -> String

Извлекает подстроку по символьным индексам в диапазоне [start, end).

  • start — начальный символьный индекс, по умолчанию 0
  • end — конечный символьный индекс (не включая), по умолчанию — конец строки

Возвращает: результат среза. Выходящие за границы индексы фиксируются в допустимом диапазоне без ошибки; при start > end фиксируется как пустая строка.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.substring("hello", 1, 4) == "ell")
    assert(string.substring("hello", 1, 99) == "ello")   // 上界钳制
}

is_empty ​

yaoxiang
is_empty: (s: &String) -> Bool

Является ли s пустой строкой.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.is_empty(""))
    assert(!string.is_empty("x"))
}

len ​

yaoxiang
len: (s: &String) -> Int

Возвращает длину в байтах UTF-8, а не количество символов.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.len("hello") == 5)
    assert(string.len("中") == 3)   // 字节长度
}

chars ​

yaoxiang
chars: (s: &String) -> Vec(String)

Разбивает на список односимвольных строк (по скалярным значениям Unicode).

yaoxiang
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 ​

yaoxiang
concat: (s1: &String, s2: &String) -> String

Сцепляет две строки. Также можно использовать оператор +.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.concat("a", "b") == "ab")
}

repeat ​

yaoxiang
repeat: (s: &String, n: Int) -> String

Повторяет s n раз.

  • n — количество повторений; при n <= 0 возвращается пустая строка
yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.repeat("ab", 3) == "ababab")
    assert(string.repeat("ab", 0) == "")
}

reverse ​

yaoxiang
reverse: (s: &String) -> String

Переворачивает строку посимвольно.

yaoxiang
use std.assert
use std.string

main: () -> Void = {
    assert(string.reverse("abc") == "cba")
}

format ​

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

yaoxiang
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 ​

yaoxiang
parse_int: (s: &String) -> Result(Int, Error)

Разбирает десятичное целое число (автоматически удаляет начальные и конечные пробелы).

Возвращает: при успехе — Result.ok(Int); при неудаче — Result.err(Error) с code равным E6010. Ошибка не выбрасывается.

yaoxiang
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 ​

yaoxiang
parse_float: (s: &String) -> Result(Float, Error)

Разбирает число с плавающей точкой (автоматически удаляет начальные и конечные пробелы).

Возвращает: при успехе — Result.ok(Float); при неудаче — Result.err(Error) с code равным E6011.

yaoxiang
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_*