如何使结构非公开而不是从lib.rs中移动它?

时间:2017-07-25 00:39:00

标签: rust

考虑这个简单的箱子:

的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

如何解决此问题?为什么它是私人的,而它是公开的箱子?

1 个答案:

答案 0 :(得分:2)

虽然不难发现这种情况,但pub允许私有类型实际上是不一致的。 pub表示商品可能可以在包装箱外使用。你没有重新出口它并不重要,可能是你重新出口它。

决定是项目声明的本地决定,以便于查看某些项目是否可以公开。如果您在项目中的随机文件中,则可以查看缺少pub说明符或pub上的约束是否肯定未公开某个项目。这显着提高了代码的可读性。

有关详情,请参阅相关的RFCtracking issue for the private_in_public lint