gpt4 book ai didi

module - 为什么 Rust 允许公共(public)访问私有(private)模块?

转载 作者:行者123 更新时间:2023-12-03 11:49:19 25 4
gpt4 key购买 nike

我是 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 可以访问私有(private) fruitsveggies 模块,只是因为它们的使用 标记为 pub?另一方面,如果我们不使用 pub use,那么,不用制作 fruitsveggies pub ,无法访问 main 中的 delicious_snacks::fruits::PEAR,因为 fruits 不是公开的。同样,如果我们不为 const PEAR 使用 pub,即使使用 pub use self::fruits::PEAR as fruit,我们仍然无法编译 delicious_snacks::fruit。那么这里的规则到底是什么?为什么不为这些模块标记 pub 是可以的?

最佳答案

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

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

// actual implementation is here
mod foo_internal;

pub use foo_internal::{Foo, Bar};

这仍然保持隐私/可见性,因为 FooBar 如果是私有(private)的则不能重新导出。

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

mod foo_internal;

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

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

这清楚地将公共(public)接口(interface)实现细节分开,因此可以在不更改公共(public)模块的情况下自由重构实现。

关于module - 为什么 Rust 允许公共(public)访问私有(private)模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60904250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com