std.result
Создание и распаковка Result(T, E), а также доступ к полям носителя Error.
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
ok: (T: Type, E: Type)(value: T) -> Result(T, E)Оборачивает успешное значение.
Значение Ok, распакованное через ?, необходимо обернуть заново, чтобы продолжить распространение по типу возврата Result; ok — именно этот обёртчик.
use std.assert
use std.result
main: () -> Void = {
r = result.ok(42)
assert(result.is_ok(r))
}err
err: (T: Type, E: Type)(error: E) -> Result(T, E)Оборачивает значение ошибки.
use std.assert
use std.result
main: () -> Void = {
r = result.err("boom")
assert(result.is_err(r))
}Проверка
is_ok
is_ok: (T: Type, E: Type)(self: &Result(T, E)) -> BoolЯвляется ли вариантом успеха. Только чтение по ссылке, self можно использовать многократно.
use std.assert
use std.result
main: () -> Void = {
r = result.ok(1)
assert(result.is_ok(r))
assert(result.is_ok(r)) // можно использовать повторно
}is_err
is_err: (T: Type, E: Type)(self: &Result(T, E)) -> BoolЯвляется ли вариантом ошибки. Только чтение по ссылке.
use std.assert
use std.result
main: () -> Void = {
r = result.err("e")
assert(result.is_err(r))
}Извлечение значения
unwrap
unwrap: (T: Type, E: Type)(self: &Result(T, E)) -> TИзвлекает успешное значение.
Возврат: значение, которое несёт вариант Ok. Ошибка: при вызове на значении Err выбрасывается E6007, а сообщение содержит исходный код ошибки и описание, например unwrap called on Err value (E6010: parse_int: ...), поэтому нет необходимости сначала вызывать unwrap_err, чтобы увидеть причину сбоя.
use std.assert
use std.result
use std.string
main: () -> Void = {
r = string.parse_int("42")
assert(result.unwrap(r) == 42)
}unwrap_or
unwrap_or: (T: Type, E: Type)(self: &Result(T, E), default: T) -> TИзвлекает успешное значение или возвращает default в случае Err.
default— резервное значение в случаеErr
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
unwrap_err: (T: Type, E: Type)(self: &Result(T, E)) -> EИзвлекает значение ошибки.
Возврат: значение, которое несёт вариант Err. Ошибка: при вызове на значении Ok выбрасывается E6007.
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
code: (self: &Error) -> StringСчитывает строку кода ошибки, например "E6010".
Сигнатура типизирована как
Error, но носитель ошибки во время выполнения — структура с полями(code, message). Вызывается непосредственно на значенииError.
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
message: (self: &Error) -> StringСчитывает текст описания ошибки.
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)
}Связанные ссылки
std.string— функция разбора, возвращающаяResult- Справочник по кодам ошибок — коды значений ошибок времени выполнения, такие как
E6010/E6011
