考虑这个简单的箱子:
的src / lib.rs
mod internal;
use internal::f;
pub(crate) struct Foo {}
pub fn g() {
f();
}
的src / internal.rs
use Foo;
pub fn f() -> Foo {
unimplemented!();
}
我想只从箱子中导出g
功能。我还想在lib.rs中定义Foo
以简化我的源代码阅读。这是箱子的一个重要结构,所以我想把它移到第一个
文件,任何潜在的读者都会打开。
编译器报告:
error[E0446]: private type `Foo` in public interface
--> src/internal.rs:3:1
|
3 | / pub fn f() -> Foo {
4 | | unimplemented!();
5 | | }
| |_^ can't leak private type
如何解决此问题?为什么它是私人的,而它是公开的箱子?
答案 0 :(得分:2)
虽然不难发现这种情况,但pub
允许私有类型实际上是不一致的。 pub
表示商品可能可以在包装箱外使用。你没有重新出口它并不重要,可能是你重新出口它。
决定是项目声明的本地决定,以便于查看某些项目是否可以公开。如果您在项目中的随机文件中,则可以查看缺少pub
说明符或pub
上的约束是否肯定未公开某个项目。这显着提高了代码的可读性。
有关详情,请参阅相关的RFC或tracking issue for the private_in_public
lint