Rust 什么时候pub和pub(super)有不同的语义?
Rust同时支持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
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
waspub
。我还没有时间给出正确的答案,但这就是我的想法。详细解释一下@Cerberus所说的,如果internal
是pub
,或者换句话说,internal
可以从任何地方进入,包括在板条箱外。如果internal_foo
也是pub
,每个人(包括外部板条箱)都可以访问它。但是,将internal\u foo
标记为pub(super)
可以确保只有父/超级模块(outer
)可以访问它,而不管包含internal\u foo
的模块(internal
)的可见性如何。