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

时间:2020-03-28 17:22:18

标签: module rust public

我是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仅因为它们的fruits被标记为veggies来访问私有usepub模块就可以了吗?另一方面,如果我们不使用pub use,那么,如果不使用fruitsveggies pub,则无法访问{ {1}},因为delicious_snacks::fruits::PEAR不是公开的。同样,如果我们不对main使用fruits,即使使用pub,我们仍然无法编译const PEAR。那么这里的规则到底是什么?为什么不为这些模块标记pub use self::fruits::PEAR as fruit呢?

1 个答案:

答案 0 :(得分:0)

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

这是一种常见的技术,用于在私有模块中实现某些内容,然后仅重新导出我们想要的内容,例如

// actual implementation is here
mod foo_internal;

pub use foo_internal::{Foo, Bar};

由于FooBar是私有的,因此无法重新导出。

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

mod foo_internal;

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

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

这显然将公共接口实施细节分开,因此可以在不更改公共模块的情况下自由重构实现。