我有一个小项目,我想封装一个struct的字段并使用已实现的方法。
├── src
├── main.rs
├── predator
└── prey
├── cycle.rs
└── mod.rs
cycle.rs
struct Prey {
name: String,
}
impl Prey {
pub fn new(n: String) -> Prey {
Prey { name: n }
}
pub fn get_name(&self) -> &str {
self.name.as_str()
}
}
我想将Prey
保密。
main.rs
use prey::cycle::Prey;
mod prey;
fn main() {
let pr = Prey::new("Hamster".to_string());
println!("Hello, world! {}", pr.get_name());
}
我收到错误:
error: struct `Prey` is private
我知道如果我将pub
放在struct Prey {}
之前,我会得到预期的结果。我将很感激解释,如何,为什么不和/或最佳实践。
答案 0 :(得分:8)
可见性适用于模块级别。如果您希望模块X能够访问模块Y中的item,则模块Y必须将其公开。
模块也是项目。如果你没有公开一个模块,那么它就是你的箱子的内部。因此,您不必担心将该模块中的项目公开;只有您的箱子才能访问它。
crate root(通常是名为 lib.rs 或 main.rs 的文件)是你的箱子的根模块。它定义了箱子的公共接口,即箱子根中的公共物品可以从其他箱子中获取。
在您的示例中,您编写mod prey;
。这将prey
模块定义为私有,因此prey
模块中的项目无法从其他包中访问(除非您使用pub use
重新导出它们)。这意味着您应该prey::cycle::Prey
公开。