Rust中的公共/私有结构

时间:2014-12-01 22:28:38

标签: struct private rust

我有一个小项目,我想封装一个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 {}之前,我会得到预期的结果。我将很感激解释,如何,为什么不和/或最佳实践。

1 个答案:

答案 0 :(得分:8)

可见性适用于模块级别。如果您希望模块X能够访问模块Y中的item,则模块Y必须将其公开。

模块也是项目。如果你没有公开一个模块,那么它就是你的箱子的内部。因此,您不必担心将该模块中的项目公开;只有您的箱子才能访问它。

crate root(通常是名为 lib.rs main.rs 的文件)是你的箱子的根模块。它定义了箱子的公共接口,即箱子根中的公共物品可以从其他箱子中获取。

在您的示例中,您编写mod prey;。这将prey模块定义为私有,因此prey模块中的项目无法从其他包中访问(除非您使用pub use重新导出它们)。这意味着您应该prey::cycle::Prey公开。