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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:35:11