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 为 RFC-013 的 E6xxx / E7xxx 段注册码(跨版本稳定契约), 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

取出成功值,或在 Err 时返回 default。

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

相关 ​