Rust中的公共/私有结构

And*_*aev 7 struct private rust

我有一个小项目,我想封装一个struct的字段并使用已实现的方法.

??? src
??? main.rs
??? predator
??? prey
   ??? cycle.rs
   ??? mod.rs
Run Code Online (Sandbox Code Playgroud)

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

我想Prey私下离开.

main.rs

use prey::cycle::Prey;
mod prey;

fn main() {
    let pr = Prey::new("Hamster".to_string());
    println!("Hello, world! {}", pr.get_name());
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

error: struct `Prey` is private
Run Code Online (Sandbox Code Playgroud)

我知道,如果我pub以前struct Prey {},我会得到预期的结果.我将很感激解释,如何,为什么不和/或最佳实践.

Fra*_*gné 8

可见性适用于模块级别.如果您希望模块X可以访问模块Y中的项目,则模块Y必须将其公开.

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

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

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