为什么非穷尽结构体无法使用结构体更新语法?

7
在结构体更新语法中,“splatted”结构体必须与结果结构体具有相同的类型。因此,扩展的结构体必须已经包含所有字段。
那么,还剩下什么没有被“用尽”?为什么非穷尽结构体不能使用结构体更新语法?
use some_crate::NonExhaustiveStruct;

let a = NonExhaustiveStruct::default();

let b = {
    some_field: true,
    ..a //Why doesn't this work?
};

@kmdreko 这是因为你需要两个板条箱。 - user1937198
@user1937198 哦,我明白了。"在定义的包中,non_exhaustive 没有任何效果。" - kmdreko
相关的 GitHub 问题:https://github.com/rust-lang/rust/issues/70564 - sffc
1个回答

8
这是一个目前明确不被支持的边缘情况:https://rust-lang.github.io/rfcs/2008-non-exhaustive.html#functional-record-updates。在同一crate内,非穷尽结构体的扩展更新语法是允许的,但是当该结构体在另一个crate中定义时,则不允许使用。

其原因是由于私有字段可能会在未来添加,而位于crate外部的代码不能对包含私有字段的结构体进行扩展更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接