在结构更新语法中,“扩展”结构必须与生成的结构具有相同的类型。因此,扩展结构必须已经包含所有字段。
那么,还剩下什么没有“用尽”呢?为什么非穷举结构不允许使用结构更新语法?
use some_crate::NonExhaustiveStruct;
let a = NonExhaustiveStruct::default();
let b = {
some_field: true,
..a //Why doesn't this work?
};
Run Code Online (Sandbox Code Playgroud)
这是目前明确不受支持的边缘情况:https : //rust-lang.github.io/rfcs/2008-non-exhaustive.html#functional-record-updates。在同一个 crate 结构中,非穷举结构允许使用更新语法,但当该结构在单独的 crate 中定义时则不允许。
这样做的原因是将来可能会添加一个私有字段,并且 crate 之外的代码无法对具有私有字段的结构进行传播更新。