如何在 Rust 中相互隐藏同级模块?

And*_*ers 5 module private rust class-visibility

我有一个 Rust 模块,breakfast其中包含两个子模块eggbacon. 该breakfast模块必须了解eggbacon,但两个子模块不需要,因此不应相互了解。

这就是我的代码现在的样子。早餐做好了,可惜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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过某种方式隐藏兄弟姐妹吗?也许是通过使用可见性修饰符或重组模块?或者我应该接受不必要的可见性?

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

Pet*_*aro 3

这是设计使然:

Rust 的名称解析在命名空间的全局层次结构上运行。层次结构中的每个级别都可以被视为某个项目。这些物品是上面提到的物品之一,但也包括外部板条箱。声明或定义一个新模块可以被认为是在定义位置的层次结构中插入一棵新树。[...]

默认情况下,Rust 中的所有内容都是私有的,但有两个例外: pub Trait 中的关联项默认是公共的;默认情况下,pub 枚举中的枚举变体也是公共的。当一个项目被声明为 pub 时,可以认为它可以被外界访问。

由于项目是公共的或私有的,Rust 允许在两种情况下访问项目:

  • 如果某个项目是公共的,那么m如果您可以从 访问该项目的所有父模块,则可以从某个模块外部访问该项目m您还可以通过再导出来命名该项目。[...]
  • 如果某个项目是私有的,则当前模块及其后代可以访问它。

有关这方面的更多信息,请参阅参考资料的相关章节

  • 有趣的是,在 C++ 和 Java 中,子类可以访问其父类可以访问的所有内容,因此 Rust 规则在这方面似乎与 C++ 和 Java 一致。我想知道是否有不同的语言表现不同。 (2认同)