Notist
On this page
  1. Option 类型
  2. 类型
  3. 可选参数边界
  4. 分解:match 构造器模式
  5. 与输出的一致
  6. 诊断

Option 类型

Option<T> 表示可选值:some(v) 携带一个 T,none 表示没有值。可选参数 arg?: T 在 Code 函数体中以 Option<T> 接收。

例如 some("x") 的类型是 Option<String>,与 String 不同。

类型

Option<T> 是内置名义泛型,T 限数据类型(不含内容类型)。身份规则:Option<A> == Option<B> 当且仅当 A == B。

Option<T> 也可作为编译期 Type 表达式,用于显式泛型实参,例如 Result<Option<String>, String>。

两个变体:

变体

含义

构造

some(v)

提供了一个 T 值

内置值构造器(特殊形式,非内容函数),T 从 v 推断

none

缺席

由 ? 参数边界产生;自由书写时类型取自已知的 Option 位置(见下)

相等规则:some 之间按载荷比较,none == none 为真,跨变体必假;Option<T> 与 T 不同型,比较必假。

可选参数边界

Code 与原生声明均可书写 arg?: T;? 与默认值互斥:

  • 调用方视图:参数类型为 T,可省略。

  • 函数体视图:arg 的类型是 Option<T>。bind 时提供的实参包成 some(v),省略则为 none。

转发是边界的逆方向:把 Option<T> 传给另一个 ?: T 参数时反向解包——none 即省略,some(v) 即 v。包装函数由此可以原样传递缺席:

fn graph(source: String, rule?: String, theme: String = "light") -> BlockContent;

fn diagram(source: String, rule?: String, theme: String = "light") -> BlockContent {
    [
        #notist.raw<BlockContent>(source)

        #graph(source, rule: rule, theme: theme)
    ]
}

分解:match 构造器模式

Option 值唯一的分解手段是 match。subject 类型为 Option<T> 时,臂左部有两种构造器形状:

let label = match rule {
    some(r) => r,      // r: String,新绑定
    none => "(全部)", // none 臂
};

some(name) 将载荷绑定为分支内的局部变量;none 匹配缺席值。

编译期已知的 Option 只检查命中的分支;运行期 Option 要求覆盖 none 和 some,或用末尾 _ 覆盖剩余情况。

与输出的一致

  • ? 参数为 none 时,HTML 输出省略对应属性。

  • some(v) 按 v 的普通编码。集合内嵌套的 Option 值递归编码:some(v) 为 ["some", v],none 为 ["none"]。

  • transform 按同签名替换实现时,原生与 Code 实现对省略的可观察行为一致:原生从缺席属性观察,Code 从 none 值观察,输出层把 none 映射回缺席。

诊断

  • none 出现在无法确定 T 的位置(没有已知的 Option 实参/元素类型、已定型的姊妹分支或声明返回类型):诊断"无法确定 none 的类型"。独立 let 不从后续用途反向推断。

  • Option<T> 传给非 ? 的 T 参数、或 some(v) / none 与 T 混用:按普通类型不匹配诊断,无隐式包装或拆包。

  • 运行期 match 的 Option subject 缺少 none 臂与 _:沿用 match 覆盖诊断。

Option 可以嵌套,例如 Option<Option<String>>。