【发布时间】:2021-03-25 12:43:46
【问题描述】:
要将子模块中的方法公开,您必须明确地重新导出它们,否则将子模块本身公开:
mod foo {
mod bar {
pub fn baz() {}
}
pub use self::bar::baz;
}
这似乎暗示pub 用于指示事物应该只对模块公开(因为您可以选择不这样做)
但是,如果您使用在外部上下文中定义的私有类型,如果您尝试在内部上下文中将涉及它的公共函数设为公共,即使它没有重新导出,也会出现错误。
mod foo {
struct Foo;
mod bar {
use super::Foo;
pub fn baz(foo: Foo) {}
}
}
结果
error[E0446]: private type `Foo` in public interface
--> src/lib.rs:7:9
|
2 | struct Foo;
| - `Foo` declared as private
...
7 | pub fn baz(foo: Foo) {}
| ^^^^^^^^^^^^^^^^^^^^ can't leak private type
使用pub 关键字的惯用方式是什么?它应该保留给实际上公开的东西还是可以用于内部模块?
【问题讨论】:
-
pub(crate)正是我想要的。谢谢 -
请注意,您可以使用
pub use super::Foo;修复编译错误
标签: rust visibility conventions