我是 Rust 新手,无法理解模块系统和pub
工作原理。
采取以下代码:
fn main() {
Test::test();
}
mod Test {
pub fn test() {
println!("Hello World");
}
}
为什么编译器不给我一个错误,指出这mod Test
是private
?
如果我在测试中声明另一个模块并且不标记它,因为pub
我收到了预期的错误。例如:
fn main() {
Test::inner::test();
}
mod Test {
mod inner {
pub fn test() {
println!("Hello World");
}
}
}
默认情况下,顶级模块可以在声明它们的文件中访问吗?
规则是什么?
不仅仅是顶级模块,每个模块都可以在其声明的文件中(或更准确地说,在其声明的模块中)进行访问。
模块在这方面并不特殊:所有项目的行为都相同。替换
mod Test {}
为fn test() {}
. 现在清楚了吗?该项目Test
在其内部声明的模块(及其任何子模块)中可见。所有项目,即使是私有的,也可供声明它们的模块使用。test()
另一方面, 也可用于声明它的模块 - 即Test
. 它在它的外部不可用(除了在它的子模块内) - 因此在顶级模块中使用它是错误的。规则是:项目始终可供其兄弟姐妹和后代(以及兄弟姐妹的后代)访问,并使
pub
项目(及其pub
子项目)对有权访问其父级(例如其父级的兄弟姐妹)的任何人可见。(请注意,这些是什么并不重要,相同的规则适用于包、模块、函数、特征、结构和结构字段。)
这是您的示例的“家谱”:
该
Test
模块是板条箱根私有的。因此,外部板条箱无法访问它,但同级(板条箱中的物品)可以。该
test
函数在内部是公开的Test
,这使得任何有权访问的人都可以使用它Test
。该
main
函数是 的兄弟函数Test
,因此它也可以访问Test
和test
。让我使用另一个例子,而不是第二个例子:
can_access_test
可以访问它,因为它是它的兄弟。can_also_access_test
可以访问它,因为test
ispub
,这使得它可以在其父级范围内访问,并且can_also_access_test
是所述父级的兄弟。cant_access_test
可以访问Test
(它是它的兄弟),但它不能访问inner
(inner
不是pub
),所以它也不能访问test
。另外,
pub use
可以在结构中创建“符号链接”:它的行为就像“采用”所有use
d 项作为其父项的直接子项一样。但思考pub use
是令人费解的,所以留到以后再说吧。请参阅Rust 参考 :: 可见性和隐私
在第一个示例中,
main
和Test
属于同一个当前模块 - 源文件的模块,因此main
可以访问 中的公共项Test
,即test
在第二个示例中,
mod inner
是私有的