Module 我的私有代码在哪里公开?

Module 我的私有代码在哪里公开?,module,rust,rust-crates,Module,Rust,Rust Crates,我发现我的代码库中有一些死代码,但没有得到预期的死代码警告。我读了铁锈书上的那篇文章。我遵循创建一个“助手模块”的示例,其中的代码将在板条箱中使用,但不会在公共API中公开 下面是一个我认为正在发生的事情的简化示例: //专用模块仅用于机箱内使用 莫德福{ //模块中的所有内容都是pub 发布结构Foo{} impl-Foo{ //我希望在这里看到死代码警告。它在哪里。。。 pub fn dead_code(){} } } 使用foo::foo; //哦,我把我的助手模块漏出来了! //但我很难

我发现我的代码库中有一些死代码,但没有得到预期的死代码警告。我读了铁锈书上的那篇文章。我遵循创建一个“助手模块”的示例,其中的代码将在板条箱中使用,但不会在公共API中公开

下面是一个我认为正在发生的事情的简化示例:

//专用模块仅用于机箱内使用
莫德福{
//模块中的所有内容都是pub
发布结构Foo{}
impl-Foo{
//我希望在这里看到死代码警告。它在哪里。。。
pub fn dead_code(){}
}
}
使用foo::foo;
//哦,我把我的助手模块漏出来了!
//但我很难在我庞大的代码库中找到这种情况:(
pub fn get_foo()->foo{
富{}
}
我的问题:我如何找到“泄漏”的代码(
get_foo
)作为公共代码,而我打算将其作为板条箱公共代码(
foo
)?在一个真实的例子中,可能有一个“泄漏”具有泄漏相关类型的多米诺骨牌效应。

pub(板条箱)
是惯用的,可以解决您的问题

//仅用于板条箱内使用的辅助模块
莫德福{
pub(板条箱)结构Foo{}
impl-Foo{
//死代码警告!
发布(板条箱)fn死_代码(){}
}
}
使用foo::foo;
//pub(板条箱)防止助手模块在此泄漏!
酒吧(板条箱)fn get_foo()->foo{
富{}
}
此代码生成(多个)死代码警告

要演示
pub(板条箱)
防止非pub项目泄漏,请将最后一个函数更改为

pub fn get_foo()->foo{
富{}
}
给出一个编译错误-
错误[E0446]:在公共接口中输入可见类型foo::foo

我认为这本书的例子并不建议使用
pub(板条箱)
,因为这一部分是在这本书引入
pub(受限)
的概念之前编写的。如果你看一下,它会特别指出你做了什么

(2.)您可以将X定义为某些子模块中的发布项(并通过use导入到模块树的根目录中)

但是:有时候这两种选择都不是你真正想要的


也许可以尝试将
pub
更改为
pub(板条箱)
,以进一步限制它?-虽然我不确定是否100%遵循了您的要求…如果代码被其他(公共)函数使用,那么它没有死。@PeterHall是的,我可以将Foo更改为pub(板条箱)问题是,我想知道私有模块中的结构以某种方式公开的所有情况。我可以将所有此类实体标记为pub(板条箱),但这似乎是一种糟糕的做法,并不是铁锈手册中建议的惯例。对于死代码,我指的是机箱中任何地方都没有使用的代码。如果模块是私有的,这并不意味着其内容也是私有的。如果要确保某个类型不暴露于公共API,则必须限制其可见性(例如,使用
pub(clate)
)。仅将其模块设置为私有模块是不够的。如果有人感兴趣,我就打开了rust reference的PR-谢谢!你对这本书的看法完全正确。(实际上,我只是注意到它是rust reference,而不是这本书。)自
pub(受限)以来,该部分没有更新
已经稳定下来。关于该功能的部分已经存在,但是关于“助手模块”的部分似乎仍然有误导性。无论如何,我会调整我的做法,更自由地使用
发布(受限)