You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust未加pub的顶层模块可直接访问的原因及规则咨询

Rust模块可见性规则:顶层模块与内部子模块的差异

为什么第一个例子没有报错?

你第一个代码示例里编译器未提示错误,核心原因是:同一文件内声明的顶层模块,默认对该文件内的所有代码可见,不需要给模块本身添加pub关键字。

结合代码示例分析

示例1:合法访问顶层模块

fn main() {
    Test::test(); // 正常工作:Test是同一文件的顶层模块,当前文件内可直接访问
}

mod Test {
    pub fn test() {
        println!("Hello World");
    }
}

这里Test是直接在当前文件中声明的顶层模块,属于当前crate根模块的子模块。同一文件内的代码(比如main函数)和该模块处于同一可见性上下文,因此可以直接引用Test的名称。而test函数加了pub,所以能被外部调用。

示例2:无法访问私有内部子模块

fn main() {
    Test::inner::test(); // 编译错误:inner是Test的私有子模块,外部无法访问
}

mod Test {
    mod inner { // 默认私有,仅Test内部可见
        pub fn test() {
            println!("Hello World");
        }
    }
}

这里inner是Test内部的子模块,Rust中模块内部的项(子模块、函数、结构体等)默认是私有的——只有父模块(Test)及其内部代码能访问它。外部代码(比如main)要访问inner,必须给inner加上pub关键字。

具体规则总结

  • 同一文件内的顶层模块:默认对该文件内的所有代码可见,无需添加pub。
  • 模块内部的项:子模块、函数、结构体等默认私有,仅能被当前模块及其子模块访问;若要让外部访问,必须给该项添加pub。
  • 跨文件模块:如果在其他文件中声明模块,需要在当前文件通过mod引入;若要让其他文件访问该模块,需在声明它的文件中使用pub mod。

内容的提问来源于stack exchange,提问作者ng.newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:06:13