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。