Rust中的公有/私有结构体

6

我有一个小项目,希望封装结构体的字段并使用已实现的方法。

├── 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());
}

I get an error:

error: struct `Prey` is private

我知道如果在 struct Prey {} 前加上 pub,我将得到期望的结果。请您解释一下为什么需要这样做,以及最佳实践是什么。
1个回答

7

可见性是在模块级别上工作的。如果您希望模块X可以访问模块Y中的一个,则模块Y必须将其公开。

模块也是项。如果您不使一个模块公开,则它是您的crate内部的。因此,您不必担心使该模块中的项目公开;只有您的crate才能访问它。

crate根(通常是名为lib.rsmain.rs的文件)是crate的根模块。它定义了crate的公共接口,即crate根中的公共项可以从其他crate中访问。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接