给定this Rust Playground中的代码:
mod domain {
#[derive(Default, Clone)]
pub struct Player {
id: String,
email: String,
}
}
mod player {
use crate::domain::Player;
impl Player {
pub fn set_email(&mut self, new_email: String) {
self.email = new_email
}
}
}
我想知道如何修复错误:
error[E0616]: field `email` of struct `Player` is private
--> src/main.rs:14:18
|
14 | self.email = new_email
| ^^^^^ private field
For more information about this error, try `rustc --explain E0616`.
我想在不同的mod(不同的文件)中实现一些Struct方法。
生成结构体,并且所有结构体都在根目录下的单个文件中。
我不想对字段使用pub
,因为我需要它们通过set_field
方法传递。
1条答案
按热度按时间zaqlnxep1#
请重新考虑将定义和实现保存在同一个模块(文件)中。这是rust世界中事实上的标准。这将更容易维护,也更容易让新接触代码库的人理解正在发生的事情。
如果你 * 真的 * 坚持在另一个模块中实现方法,你可以这样做。但是如果你要使用struct的私有字段,你会得到你所得到的错误。这里的解决方案是在你的另一个模块中使这些字段公共。你可以将你的字段标记为
pub(crate)
,这将使它们在你的板条箱 * 内 * 的任何地方都是公共的。或者如果您想在 ancestor 模块中实现,您可以使用pub(in path::to::ancestor::module)
您可以阅读更多关于here可见性和隐私性信息