Rust:main.rs内定义模块及调用报错问题咨询
Rust模块相关问题解答
1. 能不能在main.rs中声明模块?当然可以,你写的代码就是内联定义模块的实例
你疑惑的“是否可以在main.rs中通过代码块内联定义模块?”答案是肯定的。Rust允许在任何.rs文件里用mod 模块名 { ... }的语法直接定义嵌套模块,所有模块代码都放在同一个文件里,适合简单的模块结构。
2. 你的代码报错原因:把模块当成函数调用了
看你的代码,mammalia是一个模块,但你在main里写life::animalia::mammalia();,试图把它当函数调用,这就会报错“not a function”。
模块内部不能直接放执行语句(比如println!),模块里只能定义项——函数、结构体、子模块、常量这些。要解决报错,需要把println!放到一个函数里:
pub mod life { pub mod animalia { pub mod mammalia { // 把打印逻辑放到函数里 pub fn greet() { println!("mammalia"); } } } } fn main() { // 调用模块里的函数 life::animalia::mammalia::greet(); }
3. 同文件内联模块 vs 文件夹层级子模块
同文件内联模块
就是你现在写的方式:用mod 模块名 { ... }在当前文件里嵌套定义,所有代码都在一个文件中。优点是结构紧凑,适合小模块;缺点是模块复杂时文件会变臃肿。
文件夹层级子模块
当模块结构复杂时,通常用文件/文件夹来拆分,更易维护。比如要实现life::animalia::mammalia的层级:
- 第一步:在
src目录下创建life文件夹 - 第二步:在
src/life里创建mod.rs(Rust 2018+也可以直接用life.rs),里面写:pub mod animalia; - 第三步:在
src/life下创建animalia文件夹,里面创建mod.rs,写:pub mod mammalia; - 第四步:在
src/life/animalia下创建mammalia.rs,里面写模块内容:pub fn greet() { println!("mammalia"); } - 最后在main.rs里引入根模块:
pub(crate) mod life;,然后就能像之前一样调用life::animalia::mammalia::greet();
4. 关于pub(crate) mod func;的说明
pub(crate)是Rust的可见性修饰符:
- 普通的
mod func;默认是私有,只能在当前文件及其子模块中访问 pub(crate) mod func;表示这个模块在**整个当前项目(crate)**内都可以访问,但如果你的项目是作为库发布给别人用,外部项目看不到这个模块
内容的提问来源于stack exchange,提问作者DDave
相关产品推荐
相关产品推荐

