Module 我如何使生锈的物品在板条箱内公开,但在板条箱外保密?

Module 我如何使生锈的物品在板条箱内公开,但在板条箱外保密?,module,rust,public,rust-crates,Module,Rust,Public,Rust Crates,我有一个包含大量代码的板条箱,所以我将其拆分为多个文件/模块。但是,有些模块有内部不安全的东西(例如原始指针),我需要向不同的模块公开这些东西,但我不想向我的板条箱的用户公开。我该怎么做 我能想到的唯一方法就是把我的板条箱变成一个大模块,但是没有办法把它分割成不同的文件,除了看起来有点粗糙 通常,当我遇到现实世界中的问题时,Rust文档中的简单示例无法充分解释,我只是复制一个流行的现实世界板条箱,例如,但这似乎有效地公开了一切,包括原始指针。为了从库板条箱导出,必须至少有一条路径指向它,其中每个

我有一个包含大量代码的板条箱,所以我将其拆分为多个文件/模块。但是,有些模块有内部不安全的东西(例如原始指针),我需要向不同的模块公开这些东西,但我不想向我的板条箱的用户公开。我该怎么做

我能想到的唯一方法就是把我的板条箱变成一个大模块,但是没有办法把它分割成不同的文件,除了看起来有点粗糙

通常,当我遇到现实世界中的问题时,Rust文档中的简单示例无法充分解释,我只是复制一个流行的现实世界板条箱,例如,但这似乎有效地公开了一切,包括原始指针。

为了从库板条箱导出,必须至少有一条路径指向它,其中每个组件都是公共的。这意味着您需要在板条箱中公开一个项目,而不是从板条箱中导出(从现在起,为了模仿C#术语,我将称之为“内部”)的项目,就是将其放在板条箱根目录下的私有模块中

然而,这种解决办法是相当严格的。如果您想要一个包含导出函数和内部函数的模块,该怎么办?为了导出某些函数,我们需要将模块公开,这意味着该模块中的所有公共项也将被导出

因为,有一种解决方案适用于这种情况:。此功能允许您指定项目的“公开程度”。语法非常灵活(您可以使项目对特定模块树而不是整个板条箱可见),但如果您想保持简单,
pub(板条箱)
将使项目在板条箱中的任何位置都可以访问,但对其他板条箱不可访问(相当于C#中的
internal

例如,假设我们想要一个模块
util
,其中导出了
foo
(如
mycrate::util::foo
),
bar
是内部的,而
baz
是模块的私有部分。代码可能如下所示:

pub mod util {
    pub fn foo() {
        unimplemented!()
    }

    pub(crate) fn bar() {
        unimplemented!()
    }

    fn baz() {
        unimplemented!()
    }
}

如果你被困在1.18之前的锈迹,有一个解决办法,但它有点笨重。它涉及在私有模块中定义所有项,并在只包含重新导出的公共模块中仅重新导出那些要公开的项(使用
pub use
)。下面是上面的例子:

pub mod util {
    pub use util_impl::foo;
}

mod util_impl {
    pub fn foo() {
        unimplemented!()
    }

    pub fn bar() {
        unimplemented!()
    }

    fn baz() {
        unimplemented!()
    }
}
这不仅不容易阅读和理解,而且还不包括可以使用
pub
的所有情况。例如,如何使导出的结构的某些字段可以在同一板条箱中的其他模块中访问,而不同时导出它们?唯一的选择是公开一个带有单个私有字段的包装器,其类型是具有公共字段的结构;如果您想从其他板条箱中隐藏所有字段,那么这样做很好,但如果您想公开某些字段并使某些其他字段位于同一结构的内部,则这样做行不通