Rust 什么时候pub和pub(super)有不同的语义?

Rust 什么时候pub和pub(super)有不同的语义?,rust,module,encapsulation,super,Rust,Module,Encapsulation,Super,Rust同时支持pub和pub(super)pub使之成为父模块可以访问项。。。而pub(super)似乎也在做同样的事情。我尝试过使用下面的示例,交换pub和pub(super)似乎没有效果: #![allow(dead_code)] mod outer { pub(super) fn outer_foo() { inner::inner_foo(); } mod inner { pub(super) fn inner_foo() { println!(&qu

Rust同时支持
pub
pub(super)
pub
使之成为父模块可以访问项。。。而
pub(super)
似乎也在做同样的事情。我尝试过使用下面的示例,交换
pub
pub(super)
似乎没有效果:

#![allow(dead_code)]

mod outer {
    pub(super) fn outer_foo() { inner::inner_foo(); }
    mod inner {
        pub(super) fn inner_foo() { println!("hello world!"); }
    }
}

fn top_level_foo() { outer::outer_foo(); }
你为什么要用一个来代替另一个


在您的示例中,如果您将
内部
模块更改为公共模块,则差异将变得明显

例如,这是因为从主模块可以看到
outer::inner::inner\u foo

#![allow(dead_code)]

mod outer {
    pub(super) fn outer_foo() { inner::inner_foo(); }
    pub mod inner {
        pub fn inner_foo() { println!("hello world!"); }
    }
}

fn top_level_foo() { outer::outer_foo(); }

fn main() {
    outer::inner::inner_foo();
}
如果将
inner\u foo
保留为
pub(super)
,则只能从
outer
模块中看到它(因为
super
指的是超级模块,
outer
inner
内部的情况下),因此上述代码不会编译,您会看到此错误:

   |
13 |     outer::inner::inner_foo();
   |                   ^^^^^^^^^ private function
   |
note: the function `inner_foo` is defined here

请注意,
pub
也可以将
claiter
作为参数,使函数在claiter本身内公开,但不向其他claiter公开。

简而言之,这将关系到
mod internal
was
pub
。我还没有时间给出正确的答案,但这就是我的想法。详细解释一下@Cerberus所说的,如果
internal
pub
,或者换句话说,
internal
可以从任何地方进入,包括在板条箱外。如果
internal_foo
也是
pub
,每个人(包括外部板条箱)都可以访问它。但是,将
internal\u foo
标记为
pub(super)
可以确保只有父/超级模块(
outer
)可以访问它,而不管包含
internal\u foo
的模块(
internal
)的可见性如何。