dsp*_*pyz 5 visibility conventions rust
要使子模块中的方法公开,您必须显式地重新导出它们,否则使子模块本身公开:
mod foo {
mod bar {
pub fn baz() {}
}
pub use self::bar::baz;
}
Run Code Online (Sandbox Code Playgroud)
这似乎暗示pub用于指示某件事应该仅对模块公开(因为您可以选择不这样做)
但是,如果您使用在外部上下文中定义的私有类型,那么当您尝试在内部上下文中将涉及该类型的公共函数设为公共时,即使它没有重新导出,也会出现错误。
mod foo {
struct Foo;
mod bar {
use super::Foo;
pub fn baz(foo: Foo) {}
}
}
Run Code Online (Sandbox Code Playgroud)
结果是
mod foo {
mod bar {
pub fn baz() {}
}
pub use self::bar::baz;
}
Run Code Online (Sandbox Code Playgroud)
使用pub关键字的惯用方法是什么?它应该保留给实际上公共的东西还是可以用于内部模块?
您的示例无法编译的原因最终是因为RFC (136)是这么说的。(另请参阅问题 22261)
\n\n\n公共物品有哪些限制?
\n各类公共物品的规则如下:
\n\n
\n- 如果它是
\nstatic声明,则其类型中引用的项必须是公共的。- 如果它是
\nfn声明,则其特征边界、参数类型和返回类型中引用的项必须是公共的。- 如果它是
\nstructorenum声明,则其特征边界和字段类型中引用的项pub必须是公共的。- 如果是
\ntype声明,则其定义中引用的项目必须是公共的。- 如果它是一个
\ntrait声明,则在其超级特征、其类型参数的特征边界以及其方法的签名中引用的项(请参阅fn上面的情况)中引用的项必须是公共的。
简而言之,baz不允许这样做pub,因为它有一个私有类型的参数。因此,如果baz是pub,它将允许父级通过执行 来mod foo重新导出。这当然是不允许的,这就是整个例子是非法的原因。bazpub use bar::baz;
有些人之前提到过pub fn baz应该允许这样做,而不是在父模块重新导出它时给出编译错误。然而,这需要更复杂的静态分析来检测,并且最终没有完成,因为 RFC 定义它是非法的。
pub指定该项目可由父模块访问。如果所有模块祖先都是pub,则该项目将由包作为一个整体导出。
\n\n该关键字
\npub使任何模块、函数或数据结构可以从外部模块内部访问。该pub关键字还可以在声明中使用use,以从命名空间重新导出标识符。\xe2\x80\x93 Rust 文档
\n
\n\n由于项目是公共的或私有的,Rust 允许在两种情况下访问项目:
\n\n
\n- 如果一个项目是公共的,那么如果您可以从 m 访问该项目的所有祖先模块,则可以从某个模块 m 外部访问它。您还可以通过再导出来命名该项目。见下文。
\n- 如果某个项目是私有的,则当前模块及其后代可以访问它。
\n\xe2\x80\x93 Rust 参考 - 可见性和隐私
\n
| 归档时间: |
|
| 查看次数: |
1901 次 |
| 最近记录: |