为什么 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
可以访问私有 fruits
和 veggies
模块只是因为它们的 use
被标记为 pub
?另一方面,如果我们不使用 pub use
,那么,如果不使用 fruits
和 veggies
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,因为 Foo
和 Bar
如果它们是私有的则无法重新导出。
您还可以为图书馆的用户创建新的模块层次结构:
mod foo_internal;
pub mod foo {
pub use foo_internal::Foo;
}
pub mod bar {
pub use foo_internal::Bar;
}
这清楚地将 public 接口 与 实现细节 分开了,因此可以自由重构实现而无需更改 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
模块只是因为它们的 use
被标记为 pub
?另一方面,如果我们不使用 pub use
,那么,如果不使用 fruits
和 veggies
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,因为 Foo
和 Bar
如果它们是私有的则无法重新导出。
您还可以为图书馆的用户创建新的模块层次结构:
mod foo_internal;
pub mod foo {
pub use foo_internal::Foo;
}
pub mod bar {
pub use foo_internal::Bar;
}
这清楚地将 public 接口 与 实现细节 分开了,因此可以自由重构实现而无需更改 public 模块。