【发布时间】:2020-12-19 08:18:19
【问题描述】:
当我进行这种设置时出现错误:
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
短版 - 我有一个包含公共和私有字段的结构。我想用默认值初始化这个结构,但有时会覆盖它们。
我似乎无法修复此错误,也没有在 Internet 或文档中看到任何甚至提到此类错误的内容。
这让我很吃惊,因为我认为一个常见的用例是初始化一个结构,并且该结构的某些成员是私有的,因此您可以隐藏实现细节和接口。
在我的例子中,私有字段是 Vec,因为我有一些逻辑需要在向量中添加或删除内容,所以我想将其设为私有以防止任何人弄乱数据结构。
我有什么选择?
【问题讨论】:
-
如何将您的公共字段移动到单独的类型:
pub struct Data { pub x: i32, pub y: i32}; pub struct Point { pub data: Data, z: i32 };,然后执行fn new_with_data(data: Data)?您的布局略有变化,但应该可以工作。 -
我其实挺喜欢这个主意的,我会考虑考虑的
标签: rust default private public