Rust 如何使结构成为非公共结构,而不将其从lib.rs中移动?

Rust 如何使结构成为非公共结构,而不将其从lib.rs中移动?,rust,Rust,考虑一下这个简单的板条箱: src/lib.rs mod internal; use internal::f; pub(crate) struct Foo {} pub fn g() { f(); } use Foo; pub fn f() -> Foo { unimplemented!(); } src/internal.rs mod internal; use internal::f; pub(crate) struct Foo {} pub fn g

考虑一下这个简单的板条箱:

src/lib.rs

mod internal;

use internal::f;

pub(crate) struct Foo {}

pub fn g() {
    f();
}
use Foo;

pub fn f() -> Foo {
    unimplemented!();
}
src/internal.rs

mod internal;

use internal::f;

pub(crate) struct Foo {}

pub fn g() {
    f();
}
use Foo;

pub fn f() -> Foo {
    unimplemented!();
}
我只想从板条箱导出
g
功能。我还想在lib.rs中定义
Foo
,以简化对源代码的读取。这是板条箱的一个重要结构,所以我想把它移到第一个 任何潜在读者都会打开的文件

编译器报告:

错误[E0446]:公共接口中的私有类型'Foo'
-->src/internal.rs:3:1
|
3 |/pub fn f()->Foo{
4 | |未执行!();
5 | | }
|| ^无法泄漏私有类型

如何解决此问题?为什么它是私有的,而对于板条箱是公共的?

虽然不难发现这种情况,但对于
pub
来说,允许私有类型实际上是不一致的<代码>发布表示该物品可在板条箱外使用。你不重新出口它并不重要,可能是你重新出口了它

该决定是项声明的本地决定,以便很容易看到某些项是否可以公开。如果您在项目中的随机文件中,则可以查看项目是否确实没有通过缺少的
pub
说明符或
pub
上的约束公开。这大大提高了代码的可读性


有关更多详细信息,请阅读@ildjarn中的相关or,因为您可以看到
f
在模块中,不在
lib.rs
中,并且
lib.rs
不重新导出它,因此它在板条箱外部不可见。使
f
发布(板条箱)
是不够的吗?@ildjarn足够,但这令人困惑。为什么
pub
不一致。