gpt4 book ai didi

Rust 实现带有私有(private)字段的默认特征

转载 作者:行者123 更新时间:2023-12-03 11:40:44 25 4
gpt4 key购买 nike

当我进行这种设置时出现错误:
default_test.rs:

mod default_mod;

use default_mod::Point;

fn main() {
let _p1 = Point::new();
let _p2: Point = Point {
z: 1,
..Default::default()
};
}
default_mod.rs:
pub struct Point {
x: i32,
y: i32,
pub z: i32,
}

impl Point {
pub fn new() -> Self {
Point { x: 0, y: 0, z: 0 }
}
}

impl Default for Point {
fn default() -> Self {
Point { x: 0, y: 0, z: 0 }
}
}

这给出了编译器错误:
default_test.rs:9:7
|
9 | ..Default::default()
| ^^^^^^^^^^^^^^^^^^ field `x` is private

error[E0451]: field `y` of struct `default_mod::Point` is private
短版 - 我有一个包含公共(public)和私有(private)字段的结构。我想用默认值初始化这个结构,但有时会覆盖它们。
我似乎无法修复此错误,也没有在 Internet 或文档上看到任何甚至提到此类错误的内容。
这让我感到惊讶,因为我认为一个常见的用例是初始化一个结构,并且该结构的某些成员将是私有(private)的,因此您可以隐藏实现细节和接口(interface)。
在我的情况下,私有(private)字段是 Vec因为我有一些逻辑需要从向量中添加或删除东西,所以我想将其设为私有(private)以防止任何人弄乱数据结构。
我在这里有什么选择?

最佳答案

It surprises me, because I'd think a common use-case would be to initialise a struct, and that some members of the struct would be private so you can hide implementation details behind and interface.


问题是 struct update 语法并没有按照您的想法执行。例如, the book显示以下代码:
let user2 = User {
email: String::from("another@example.com"),
username: String::from("anotherusername567"),
..user1
};
..user1语法填写 User我们没有明确指定的字段,例如 active: user1.active, signin_count: user1.signin_count . ..后面可以是返回结构的任意表达式,其中 Default::default()发挥作用,与 User::default() 含义相同因为一个 User是期待。但是,脱糖保持不变,归结为分配单个字段,在任何情况下都不会授予对私有(private)字段的特殊访问权限。
回到你的例子,这段代码:
let p = Point {
z: 1,
..Default::default()
};
是语法糖:
let p = {
let _tmp = Point::default();
Point {
x: _tmp.x,
y: _tmp.y,
z: 1,
}
};
而不是预期的:
// NOT what happens
let p = {
let _tmp = Point::default();
p.z = 1;
_tmp
};

What are my options here?


最惯用的选项是提供 builder对于 Point .这也有点笨重1,所以如果你正在寻找一个简单的解决方案,你也可以使用 Point::default()并设置 z手动属性。结构更新语法与具有私有(private)字段的结构不兼容,并且对您的类型没有用处。

1
虽然有像 derive_builder 这样的 crate , typed-builderbuilder-pattern这消除了一些苦差事。

关于Rust 实现带有私有(private)字段的默认特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63666959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com