我是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
来访问私有use
和pub
模块就可以了吗?另一方面,如果我们不使用pub use
,那么,如果不使用fruits
和veggies
pub
,则无法访问{ {1}},因为delicious_snacks::fruits::PEAR
不是公开的。同样,如果我们不对main
使用fruits
,即使使用pub
,我们仍然无法编译const PEAR
。那么这里的规则到底是什么?为什么不为这些模块标记pub use self::fruits::PEAR as fruit
呢?
答案 0 :(得分:0)
常量PEAR/APPLE/CUCUMBER/CARROT
被标记为pub
,这意味着即使它们在私有模块中,也可以从任何地方访问它们。
这是一种常见的技术,用于在私有模块中实现某些内容,然后仅重新导出我们想要的内容,例如
// actual implementation is here
mod foo_internal;
pub use foo_internal::{Foo, Bar};
由于Foo
和Bar
是私有的,因此无法重新导出。
您还可以为您的库用户创建新的模块层次结构:
mod foo_internal;
pub mod foo {
pub use foo_internal::Foo;
}
pub mod bar {
pub use foo_internal::Bar;
}
这显然将公共接口与实施细节分开,因此可以在不更改公共模块的情况下自由重构实现。