Skip to content

std.result ​

Создание и распаковка Result(T, E), а также доступ к полям носителя Error.

yaoxiang
use std.result

Представление во время выполнения ​

ЗначениеПредставление
Result.ok(value)значение-вариант перечисления, несущий value
Result.err(error)значение-вариант перечисления, несущий error
Errorструктура с полями (code, message)

Error.code — это регистрационный код сегмента E6xxx / E7xxx из RFC-013 (стабильный контракт между версиями), Error.message — удобочитаемое описание для человека.

Обзор функций ​

ФункцияСигнатура
is_ok(T: Type, E: Type)(self: &Result(T, E)) -> Bool
is_err(T: Type, E: Type)(self: &Result(T, E)) -> Bool
unwrap(T: Type, E: Type)(self: &Result(T, E)) -> T
unwrap_or(T: Type, E: Type)(self: &Result(T, E), default: T) -> T
ok(T: Type, E: Type)(value: T) -> Result(T, E)
err(T: Type, E: Type)(error: E) -> Result(T, E)
unwrap_err(T: Type, E: Type)(self: &Result(T, E)) -> E
code(self: &Error) -> String
message(self: &Error) -> String

Создание ​

ok ​

yaoxiang
ok: (T: Type, E: Type)(value: T) -> Result(T, E)

Оборачивает успешное значение.

Значение Ok, распакованное через ?, необходимо обернуть заново, чтобы продолжить распространение по типу возврата Result; ok — именно этот обёртчик.

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.ok(42)
    assert(result.is_ok(r))
}

err ​

yaoxiang
err: (T: Type, E: Type)(error: E) -> Result(T, E)

Оборачивает значение ошибки.

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.err("boom")
    assert(result.is_err(r))
}

Проверка ​

is_ok ​

yaoxiang
is_ok: (T: Type, E: Type)(self: &Result(T, E)) -> Bool

Является ли вариантом успеха. Только чтение по ссылке, self можно использовать многократно.

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.ok(1)
    assert(result.is_ok(r))
    assert(result.is_ok(r))      // можно использовать повторно
}

is_err ​

yaoxiang
is_err: (T: Type, E: Type)(self: &Result(T, E)) -> Bool

Является ли вариантом ошибки. Только чтение по ссылке.

yaoxiang
use std.assert
use std.result

main: () -> Void = {
    r = result.err("e")
    assert(result.is_err(r))
}

Извлечение значения ​

unwrap ​

yaoxiang
unwrap: (T: Type, E: Type)(self: &Result(T, E)) -> T

Извлекает успешное значение.

Возврат: значение, которое несёт вариант Ok. Ошибка: при вызове на значении Err выбрасывается E6007, а сообщение содержит исходный код ошибки и описание, например unwrap called on Err value (E6010: parse_int: ...), поэтому нет необходимости сначала вызывать unwrap_err, чтобы увидеть причину сбоя.

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("42")
    assert(result.unwrap(r) == 42)
}

unwrap_or ​

yaoxiang
unwrap_or: (T: Type, E: Type)(self: &Result(T, E), default: T) -> T

Извлекает успешное значение или возвращает default в случае Err.

  • default — резервное значение в случае Err
yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    good = string.parse_int("42")
    assert(result.unwrap_or(good, 0) == 42)

    bad = string.parse_int("abc")
    assert(result.unwrap_or(bad, 0) == 0)
}

unwrap_err ​

yaoxiang
unwrap_err: (T: Type, E: Type)(self: &Result(T, E)) -> E

Извлекает значение ошибки.

Возврат: значение, которое несёт вариант Err. Ошибка: при вызове на значении Ok выбрасывается E6007.

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("abc")
    e = result.unwrap_err(r)
    assert(result.is_err(r))
}

Поля Error ​

code ​

yaoxiang
code: (self: &Error) -> String

Считывает строку кода ошибки, например "E6010".

Сигнатура типизирована как Error, но носитель ошибки во время выполнения — структура с полями (code, message). Вызывается непосредственно на значении Error.

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("abc")
    e = result.unwrap_err(r)
    assert(result.code(e) == "E6010")
}

message ​

yaoxiang
message: (self: &Error) -> String

Считывает текст описания ошибки.

yaoxiang
use std.assert
use std.result
use std.string

main: () -> Void = {
    r = string.parse_int("abc")
    e = result.unwrap_err(r)
    assert(string.len(result.message(e)) > 0)
}

Связанные ссылки ​