Rust “pub”是指公共对板条箱还是公共对模块?

Rust “pub”是指公共对板条箱还是公共对模块?,rust,visibility,conventions,Rust,Visibility,Conventions,要使子模块中的方法成为公共的,必须显式地重新导出它们,或者使子模块本身成为公共的: mod foo { mod bar { pub fn baz() {} } pub use self::bar::baz; } 这似乎暗示pub用于指示某个对象应该仅对模块公开(因为您可以选择不公开) 但是,如果您使用在外部上下文中定义的私有类型,如果您尝试将涉及它的公共函数在内部上下文中公开,即使它没有重新导出,也会出现错误 mod foo { struct F

要使子模块中的方法成为公共的,必须显式地重新导出它们,或者使子模块本身成为公共的:

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) {}
    }
}
导致

错误[E0446]:公共接口中的私有类型'Foo'
-->src/lib.rs:7:9
|
2 |结构Foo;
|-`Foo`被宣布为私有
...
7 | pub fn baz(foo:foo){}
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^不能泄漏私有类型

使用
pub
关键字的惯用方法是什么?它是应该保留给真正公开的东西,还是可以用于内部模块?

您的示例无法编译的原因最终是因为上面所说的。(另见)

对公共物品有哪些限制? 各类公共物品的规定如下:

  • 如果是
    静态
    声明,则其类型中引用的项必须是公共的
  • 如果它是一个
    fn
    声明,在其特征边界、参数类型和返回类型中引用的项必须是公共的。
  • 如果它是
    struct
    enum
    声明,则在其trait边界及其
    pub
    字段的类型中引用的项必须是公共的
  • 如果是
    类型
    声明,则其定义中引用的项目必须是公共的
  • 如果是
    trait
    声明,则其超级traits、其类型参数的trait边界以及其方法的签名(请参见上面的
    fn
    案例)中引用的项目必须是公共的
简而言之,
baz
不允许是
pub
,因为它有一个私有类型的参数。因此,如果
baz
pub
,它将允许父
mod foo
通过执行
pub use bar::baz重新导出
baz
。这当然是不允许的,这就是为什么这个例子作为一个整体是非法的

一些人之前提到应该允许
pub fn baz
,而不是在父模块重新导出时给出编译错误。然而,这将需要更复杂的静态分析来检测,最终还没有完成,因为RFC定义它是非法的


pub
指定父模块可以访问该项。如果所有模块祖先都是
pub
,则该项目将作为一个整体由板条箱导出

关键字
pub
可以从外部模块内部访问任何模块、函数或数据结构。
pub
关键字也可用于
use
声明中,以从命名空间重新导出标识符

由于项目可以是公共的,也可以是私有的,Rust允许在两种情况下访问项目:

  • 如果某个项是公共的,那么如果您可以从某个模块m访问该项的所有祖先模块,则可以从该模块m外部访问该项。您还可以通过重新导出来命名项目。见下文
  • 如果项目是私有的,则当前模块及其子代可以访问该项目

  • 我了解酒吧的运作机制。我不知道什么时候该用它。为什么编译器在我的示例中抱怨公共接口中的私有类型?请注意,我用
    约定标记了这个问题
    好的,给我一分钟,我会重做答案:)听起来你想要
    发布(板条箱)
    正是我想要的。谢谢注意,您可以使用
    pub use super::Foo修复编译错误