Rust 如何使结构成为非公共结构,而不将其从lib.rs中移动?
考虑一下这个简单的板条箱: src/lib.rsRust 如何使结构成为非公共结构,而不将其从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
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
不一致。