Почему Rust разрешает доступ publi c к приватному модулю? - PullRequest
0 голосов
/ 28 марта 2020

Я новичок ie в 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 в main, потому что fruits не опубликован c. Точно так же, если мы не используем pub для const PEAR, даже с pub use self::fruits::PEAR as fruit, мы все равно не можем скомпилировать delicious_snacks::fruit. Так что именно здесь является правилом? Почему нормально не отмечать pub для этих модулей?

1 Ответ

0 голосов
/ 28 марта 2020

Константы PEAR/APPLE/CUCUMBER/CARROT помечены как pub, что означает, что к ним можно получить доступ из любой точки мира, даже если они находятся в частном модуле.

Это обычная техника для реализации чего-либо в закрытый модуль и реэкспорт только того, что нам нужно, например,

// actual implementation is here
mod foo_internal;

pub use foo_internal::{Foo, Bar};

Это все еще сохраняет конфиденциальность / видимость, поскольку Foo и Bar не могут быть реэкспортированы, если они private.

Вы также можете создать новую иерархию модулей для пользователей вашей библиотеки:

mod foo_internal;

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

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

Это явно отделяет интерфейс publi c от детали реализации , поэтому реализация может быть свободно реорганизована без изменения модулей publi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...