gpt4 book ai didi

module - 我如何使 Rust 项在 crate 内公开,但在 crate 外私有(private)?

转载 作者:行者123 更新时间:2023-11-29 08:21:14 27 4
gpt4 key购买 nike

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

我能想到的唯一方法就是让我的箱子实际上只是一个大模块,但是除了this solution 之外没有办法将它分成不同的文件。这似乎有点老套。

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

最佳答案

为了 item要从库箱中导出,必须至少有一个路径通向它,其中每个组件都是公共(public)的。这意味着你需要做的就是让一个项目在你的箱子里公开但不从箱子里导出(我从现在起称之为“内部”,以模仿 C# 术语)是把它放在箱子根目录下的私有(private)模块中.

但是,该解决方案非常受限。如果您想要一个带有导出函数内部函数的模块怎么办?为了导出一些功能,我们需要将模块公开,这意味着该模块中的所有公共(public)项目也将被导出。

Rust 1.18 ,有一个适合这种场景的解决方案:pub(restricted) .此功能允许您指定项目的“公开程度”。语法非常灵活(您可以使项目对特定模块树而不是整个 crate 可见),但如果您想保持简单,pub(crate) 将使项目在任何地方都可访问在 crate 内,但不在其他 crate 内(相当于 C# 中的 internal)。

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

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

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

fn baz() {
unimplemented!()
}
}

如果您还在使用 1.18 之前的 Rust,有一个解决方法,但它有点笨拙。它涉及在私有(private)模块中定义您的所有项目,并在包含再导出的公共(public)模块中仅重新导出您想要公开的项目(使用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 的所有情况。例如,如何在不导出它们的情况下使同一个 crate 中的其他模块可以访问导出结构的某些字段?唯一的选择是公开一个带有单个私有(private)字段的包装器,其类型是具有公共(public)字段的结构;如果你想从其他 crate 中隐藏所有字段,这很好用,但如果你想公开某些字段,则效果不佳并且在同一结构中使其他一些字段成为内部。

关于module - 我如何使 Rust 项在 crate 内公开,但在 crate 外私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41923330/

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