pub 和 pub(super) 什么时候有不同的语义?
When if ever do pub and pub(super) have different semantics?
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(); }
为什么你会用一个而不是另一个?
在您的示例中,如果您将 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
指的是超级模块,outer
在 inner
内的东西的情况下,因此上面的代码不会编译,你会看到这个错误:
|
13 | outer::inner::inner_foo();
| ^^^^^^^^^ private function
|
note: the function `inner_foo` is defined here
注意 pub
也可以将 crate
作为参数,使函数 public 在 crate 本身内,而不是其他 crate。
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(); }
为什么你会用一个而不是另一个?
在您的示例中,如果您将 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
指的是超级模块,outer
在 inner
内的东西的情况下,因此上面的代码不会编译,你会看到这个错误:
|
13 | outer::inner::inner_foo();
| ^^^^^^^^^ private function
|
note: the function `inner_foo` is defined here
注意 pub
也可以将 crate
作为参数,使函数 public 在 crate 本身内,而不是其他 crate。