Skip to content

Справочник по стандартной библиотеке ​

Стандартная библиотека YaoXiang (std) организована по модулям; каждый модуль импортируется через use и затем вызывается как имя_модуля.имя_функции(...). Данный раздел представляет собой справочную документацию по API, разделённую по модулям.

Индекс модулей ​

МодульЭкспортовОписание
std.convert11Преобразование произвольного значения в String
std.dict11Чтение/запись словаря, представления ключей/значений и слияние
std.io7Стандартный вывод, стандартный ввод и чтение/запись файлов целиком
std.math18Целочисленные, вещественные и тригонометрические функции, включая константы PI/E/TAU
std.string19Поиск в строках, разбиение, форматирование и разбор
std.time14Метки времени, форматирование и доступ к полям DateTime
std.result9Конструирование и распаковка Result и Error
std.range10Итерация по диапазонам, предикаты и ленивые адаптеры
std.assert1Утверждения
std.net4HTTP-запросы и URL percent-encoding
std.concurrent3Засыпание, уступка планировщику и идентификатор потока
std.os22Файловые дескрипторы, каталоги, переменные среды и рабочий каталог
std.weak2Слабые ссылки Arc / Weak

Соглашения об импорте ​

Импорт модуля целиком:

yaoxiang
use std.list
use std.string

main: () -> Void = {
    parts = string.split("a,b,c", ",")
    println(list.len(parts))
}

Также можно импортировать из модуля по имени, включая константы:

yaoxiang
use std.assert
use std.math.{E, PI, TAU}

main: () -> Void = {
    assert(PI > 3.14)
}

Соглашения о заимствовании параметров ​

Символ & в сигнатуре обозначает автоматическое заимствование только для чтения (RFC-009 §2.8): переменная, переданная вызывающей стороной, не перемещается и остаётся доступной после вызова. Это форма по умолчанию для большого числа функций только-для-чтения в стандартной библиотеке.

yaoxiang
use std.assert
use std.list

main: () -> Void = {
    nums = [1, 2, 3]

    // 三处调用都只读借用 nums,之后仍可用
    assert(list.len(nums) == 3)
    assert(list.len(nums) == 3)
    assert(list.contains(nums, 2))
}

Параметры без & означают передачу по значению. Поэтому большинство «модифицирующих» функций имеют функциональную форму, поглощающую исходное значение и возвращающую новое, а не изменение на месте:

yaoxiang
use std.assert
use std.list

main: () -> Void = {
    base = [1, 2]
    extended = list.push(base, 3)   // 返回新列表;base 已被移动
    assert(list.len(extended) == 3)
}

Раздел «Семантическая классификация» на странице каждого модуля перечисляет, какие функции модуля заимствуют, какие поглощают, а какие изменяют на месте. Есть один момент, требующий особого внимания:

  • сигнатуры list.pop / list.remove_at помечены как &List(A), однако изменяют список на месте

Модель ошибок ​

В стандартной библиотеке есть два вида сбоев; в описаниях функций они отмечаются соответственно как «ошибка» и «возвращает …»:

ВидПоведениеТипичный сценарий
Выброс ошибки выполненияПрерывает текущее выполнение с кодом E6xxxОтсутствующий ключ словаря E6008, выход за границы индекса E6003, сбой утверждения
Возврат контрольного значенияНе прерывает, возвращает Void / -1 / ""Чтение списка за границами, взятие первого элемента пустого списка, отсутствующая переменная среды

Распространённые коды ошибок выполнения:

КодЗначениеПример срабатывания
E6003Выход за границы индексаlist.set(l, 99, v)
E6005Сбой утвержденияassert(false)
E6007Общая ошибка выполненияФайл не существует, сбой result.unwrap
E6008Отсутствующий ключdict.get(d, "nope")
E6010Сбой разбора целого числа (как значение Err)string.parse_int("abc")
E6011Сбой разбора вещественного числа (как значение Err)string.parse_float("abc")

Полную таблицу кодов ошибок см. в Справочнике по кодам ошибок.

string.parse_int / string.parse_float относятся к третьему виду: не выбрасывают ошибку, а упаковывают сбой в значение Err типа Result, которое можно распаковать с помощью std.result или распространить через ?.

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")))
}

Протокол итерации ​

std.list и std.range предоставляют один и тот же протокол итераторов. Сам итератор является носителем состояния типа Tuple.

Семантика перемещения: и next, и has_next перемещают итератор (в сигнатуре нет &), поэтому при каждом использовании его нужно создавать заново либо сразу использовать for ... in.

yaoxiang
use std.assert
use std.list

main: () -> Void = {
    it = list.iter([1, 2, 3])
    assert(list.has_next(it))

    // has_next 移动了 it,重新创建后再取元素
    it2 = list.iter([1, 2, 3])
    assert(list.next(it2) == 1)
}

Для повседневного обхода сразу используйте for ... in:

yaoxiang
use std.assert

main: () -> Void = {
    mut sum = 0
    for x in [1, 2, 3] {
        sum = sum + x
    }
    assert(sum == 6)
}

range.map / range.filter возвращают ленивые адаптеры, которые выдают результат только после потребления через collect / reduce / for_each / for ... in:

yaoxiang
use std.assert
use std.list
use std.range
use std.result

main: () -> Void = {
    doubled = range.collect(range.map(result.unwrap(range.iter(1..4)), x => x * 2))
    assert(list.get(doubled, 0) == 2)
    assert(list.len(doubled) == 3)
}

Доступность по платформам ​

Следующее содержимое зависит от возможностей ОС и не экспортируется на целевой платформе wasm32:

ОбластьТребует
std.os целиком, std.net целиком, std.weak целикомФайлы/сеть
std.concurrent целикомПотоки
std.io.read_line / read_file / write_file / append_fileСтандартный ввод-вывод
std.time.sleepЗасыпание потока

std.string / std.list / std.dict / std.math / std.convert / std.result / std.range / std.assert, а также std.io.print / println / format_fallback доступны на всех целевых платформах.

Реализованные пробелы ​

Следующие проблемы были поочерёдно подтверждены реальным запуском примеров при написании документации, для всех открыты issue для отслеживания.

Исправлено (2026-09-19): все четыре пункта #337 / #338 / #339 / #340 исправлены, основной текст соответствующих страниц синхронно переписан под нормальное использование:

РасположениеИсходная проблемаИсправление
os.openДескриптор одноразовый, open→write→close не компилируетсяДескриптор передаётся по ссылке ✅
time.datetime_*8 аксессоров нельзя вызвать из исходного кода (имя экспорта содержит ::)Переход на плоские имена datetime_year и т. д. ✅
time.parse_timeПараметр fmt игнорировался; возвращаемое значение нельзя использовать дальшеПошаговый разбор по fmt ✅
math.clampПри min > max интерпретатор паниковал вместо возврата ошибкиВозвращает E6007 ✅

Всё ещё открыто:

РасположениеПроблемаОтслеживание
net.http_get / http_postЗаглушка, не отправляет запрос, возвращает строку-описание#56

Поддержка документации ​

Данный раздел представляет собой гибридную структуру сгенерированного и написанного вручную контента:

  • Сгенерированная область (между маркерами <!-- stdlib:KEY start/end -->): сводные таблицы функций и блоки сигнатур, порождённые из StdModule::exports(). Сигнатуры побайтово берутся из NativeExport::signature и не могут расходиться с реализацией.
  • Написанная вручную область (вне маркеров): обзоры модулей, семантика заимствования/перемещения, модель ошибок, известные пробелы и примеры.

Контрольные проверки (запускаются в CI вместе с cargo test --lib):

ПроверкаТестНазначение
Обнаружение расхожденийtest_stdlib_docs_match_generationСгенерированная область должна совпадать с exports()
Обнаружение сиротtest_stdlib_docs_has_no_orphan_module_pagesСтраниц модулей не должно быть больше, чем выдаёт генератор
Покрытиеtest_stdlib_docs_covers_interface_modulesНабор документированных модулей должен покрывать представление интерфейсов
Примеры запускаемыtest_stdlib_docs_examples_runКаждый yaoxiang-пример должен действительно запускаться

После изменения exports() используйте инструмент лечения для перезаписи сгенерированной области:

bash
cargo run --example gen-stdlib-docs

Аналогично gen-std-interfaces (представление интерфейсов RFC-037), tools/code-tables --fix (таблица кодов RFC-013).

Связанные документы ​