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

When if ever do pub and pub(super) have different semantics?

Rust 支持 pubpub(super)pub 使得父模块可以访问一个项目...并且 pub(super) 似乎也做完全相同的事情。我试过玩下面的例子,交换 pubpub(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(); }

为什么你会用一个而不是另一个?

Playground link.

在您的示例中,如果您将 inner 模块更改为 public,那么区别就会变得很明显。

例如,这是有效的,因为 outer::inner::inner_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_foo 保留为 pub(super),它将只在 outer 模块中可见(因为 super 指的是超级模块,outerinner 内的东西的情况下,因此上面的代码不会编译,你会看到这个错误:

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

注意 pub 也可以将 crate 作为参数,使函数 public 在 crate 本身内,而不是其他 crate。