rust 如何在不同的mod中实现结构体的方法?

rqdpfwrv  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(241)

给定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方法传递。

zaqlnxep

zaqlnxep1#

请重新考虑将定义和实现保存在同一个模块(文件)中。这是rust世界中事实上的标准。这将更容易维护,也更容易让新接触代码库的人理解正在发生的事情。
如果你 * 真的 * 坚持在另一个模块中实现方法,你可以这样做。但是如果你要使用struct的私有字段,你会得到你所得到的错误。这里的解决方案是在你的另一个模块中使这些字段公共。你可以将你的字段标记为pub(crate),这将使它们在你的板条箱 * 内 * 的任何地方都是公共的。或者如果您想在 ancestor 模块中实现,您可以使用pub(in path::to::ancestor::module)您可以阅读更多关于here可见性和隐私性信息

相关问题