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>。
两个变体:
变体 | 含义 | 构造 |
|---|---|---|
| 提供了一个 T 值 | 内置值构造器(特殊形式,非内容函数),T 从 v 推断 |
| 缺席 | 由 |
相等规则: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>>。