为什么 Rust 允许 public 访问私有模块?

Why does Rust allow public access to a private module?

我是 Rust 的新手,刚开始边看编程书边做 rustling 练习。在 modules2.rs 练习中,我对以下代码编译的原因感到困惑:

mod delicious_snacks {
    pub use self::fruits::PEAR as fruit;
    pub use self::veggies::CUCUMBER as veggie;

    mod fruits {
        pub const PEAR: &'static str = "Pear";
        pub const APPLE: &'static str = "Apple";
    }

    mod veggies {
        pub const CUCUMBER: &'static str = "Cucumber";
        pub const CARROT: &'static str = "Carrot";
    }
}

fn main() {
    println!(
        "favorite snacks: {} and {}",
        delicious_snacks::fruit,
        delicious_snacks::veggie
    );
}  

具体来说,我想知道为什么 main 可以访问私有 fruitsveggies 模块只是因为它们的 use 被标记为 pub?另一方面,如果我们不使用 pub use,那么,如果不使用 fruitsveggies pub,就无法访​​问 delicious_snacks::fruits::PEAR in main 因为 fruits 不是 public。同样,如果我们不对const PEAR使用pub,即使使用pub use self::fruits::PEAR as fruit,我们仍然无法编译delicious_snacks::fruit。那么这里的规则到底是什么?为什么可以不为这些模块标记 pub

常量 PEAR/APPLE/CUCUMBER/CARROT 被标记为 pub,这意味着它们可以从任何地方访问,即使它们在私有模块中。

这是一种常用的技术,在私有模块中实现一些东西,然后只重新导出我们想要的东西,例如

// actual implementation is here
mod foo_internal;

pub use foo_internal::{Foo, Bar};

这仍然保持 privacy/visibility,因为 FooBar 如果它们是私有的则无法重新导出。

您还可以为图书馆的用户创建新的模块层次结构:

mod foo_internal;

pub mod foo {
    pub use foo_internal::Foo;
}

pub mod bar {
    pub use foo_internal::Bar;
}

这清楚地将 public 接口 实现细节 分开了,因此可以自由重构实现而无需更改 public 模块。