Notist
On this page
  1. Result 类型
  2. 类型与构造
  3. 分解与传播
  4. 嵌套、求值与输出

Result 类型

Result<T, E> 表示一次操作的普通数据结果:ok(value) 携带 T,err(error) 携带 E。错误值不是异常,也不会自行产生诊断或中止文档求值;调用方通过 match 处理或显式返回它。

类型与构造

T 与 E 都限数据类型,不允许 Type、InlineContent 或 BlockContent。两者都参与名义类型身份:Result<Int, String> 与 Result<Int, Bool> 不同型,即使当前值恰好是 ok。没有 T/E 到 Result 的隐式包装,也没有自动拆包。

fn checked(value: Int) -> Result<Int, String> {
    if value > 0 { ok(value) } else { err("expected a positive integer") }
}

构造器只能从载荷推断当前一侧的类型,另一侧必须有明确上下文:

  • 声明返回类型传到函数尾表达式、if/match 分支。

  • 已知的参数类型传到实参;显式编译期类型实参会先完成替换。

  • 一个已定型的姊妹分支可以给另一个分支提供上下文。

  • 独立 let 初始化式没有来自后续用途的反向推断;写 ok<Int, String>(1) 或 err<Int, String>("bad"),两个类型参数顺序始终为 T、E。

fn label(value: Result<Int, String>) -> String {
    match value { ok(n) => "valid", err(message) => message }
}

fn example(flag: Bool) -> String {
    let first = ok<Int, String>(1);
    let second = if flag { first } else { err("unavailable") };
    label(second)
}

ok/err 是内建值构造特殊形式,不是内容函数;只接受一个位置实参,可选的 <T, E> 也只接受位置类型实参,不接受 children。Result<T, E>、Option<T> 和 Array<T> 都可作为已知的编译期 Type 表达式使用。

分解与传播

Result 的分解使用 match:

fn show(value: Int) -> InlineContent {
    match checked(value) {
        ok(n) => [valid],
        err(message) => [#text(text: message)],
    }
}
  • 必须覆盖 ok(name) 与 err(name),或者以 _ 臂覆盖剩余情况;此规则也适用于编译期已知的 subject。

  • ok(_)/err(_) 丢弃载荷;嵌套值使用嵌套 match 分解。

  • 臂绑定只在自己的分支体内有效,可以遮蔽外层名字,不改变原 subject 的静态类型。

  • 重复变体臂或 _ 之后的臂产生不可达诊断。

  • subject 只求值一次,只有选中的分支在运行期执行。subject 编译期已知时,仅检查选中的分支体;模式与覆盖仍需合法。

  • Result 支持 ==/!=:相同变体按载荷比较,不同变体不等;两个操作数的完整类型必须相同。不支持排序与算术。

传播错误时,在 err 臂中返回 err(message),声明返回类型为它提供 T。结构化数据的辅助函数见 DataError 与诊断升级。

需要中止当前计算时,可以在 err 臂调用 panic(message);它返回 Never,可以与正常 T 分支合并,见 Never 与 panic。

嵌套、求值与输出

Result 可以嵌入 Array、Dict、Option 或另一个 Result。例如 Result<Option<String>, String> 的 ok(none) 是成功但无值,与 err("bad") 不同。两种变体的载荷都参与现有逻辑值大小预算与 Path 导出检查。

纯 Result 构造与匹配可以在 comptime 执行,完整静态类型在折叠后保留。它不把内部求值器的失败变成可捕获值:ok(read_text(source)) 若读取失败,走正常诊断通道;输入未准备返回宿主 NeedResources。这些操作同样受资源授权、输入一致性、预算与 Code-only 限制约束。

组件参数使用带标签的编码:["ok", payload]/["err", payload];浏览器解码为 { kind: "ok", value: ... }/{ kind: "err", value: ... }。调试与模板展示 JSON 使用 { "ok": ... }/{ "err": ... }。

独立 Markup 的实参、注解和声明默认值遵守数据字面量限制,不为 Result 开放任意调用。需要构造或处理 Result 时放在 notc Code 中;JSON/TOML 接口见 Data,read_text 的返回类型保持 String。