如何在 Rust 中相互隐藏兄弟模块?

How to hide sibling modules from each other in Rust?

我有一个 Rust 模块 breakfast,其中包含两个子模块 eggbaconbreakfast 模块必须知道 eggbacon,但是两个 children 不需要,因此不应该知道彼此。

这就是我的代码现在的样子。早餐做好了,但不幸的是 eggbacon 可以互相访问。

mod breakfast {
    pub fn make_breakfast() -> String {
        format!("{} and {}", egg::EGG, bacon::BACON)
    }

    mod egg {
        pub const EGG: &'static str = "egg";
    }

    mod bacon {
        pub const BACON: &'static str = "bacon";

        // Oh no! The bacon knows about the egg!
        // I want this to be a compile error.
        use super::egg::EGG;
    }
}

我能否以某种方式将兄弟姐妹彼此隐藏起来,也许是通过使用可见性修饰符或通过重构模块?还是我应该接受不必要的可见性?

实际上,模块在单独的文件中,但我将它们放在一个文件中以提供更清晰的示例。

这是设计使然:

Rust's name resolution operates on a global hierarchy of namespaces. Each level in the hierarchy can be thought of as some item. The items are one of those mentioned above, but also include external crates. Declaring or defining a new module can be thought of as inserting a new tree into the hierarchy at the location of the definition. [...]

By default, everything in Rust is private, with two exceptions: Associated items in a pub Trait are public by default; Enum variants in a pub enum are also public by default. When an item is declared as pub, it can be thought of as being accessible to the outside world.

With the notion of an item being either public or private, Rust allows item accesses in two cases:

  • If an item is public, then it can be accessed externally from some module m if you can access all the item's parent modules from m. You can also potentially be able to name the item through re-exports. [...]
  • If an item is private, it may be accessed by the current module and its descendants.

有关这方面的更多信息,请参阅The Reference

的相关章节