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

Rust中如何实现两个兄弟文件互相调用函数?

Rust中实现两个模块互相调用(类似C++ friend)

在Rust里没有C++的friend关键字,但可以通过模块可见性控制和正确的模块引用方式实现两个文件的互相调用,避免循环mod声明的问题。以下是具体解决方案:

问题分析

你当前的代码存在几个问题:

  1. file0.rs中使用mod main是错误的,Rust的模块是树形结构,不能循环声明模块;
  2. main.rs中testB未定义,且println的格式参数使用错误;
  3. 未将需要跨模块调用的函数标记为pub,Rust默认项是私有,无法被外部模块访问。

方案一:通过Crate根直接引用(最简单)

main.rs是Crate的根模块,其他子模块可以通过crate::前缀直接访问根模块的公共项。

修正后的代码

main.rs

mod file0;

// 标记为pub,让其他模块可以访问
pub fn testA() -> i32 {
    2
}

pub fn testB() -> i32 {
    3
}

fn main() {
    // 修正println的格式,调用正确的函数名
    println!("file0::testA() = {}", file0::testA());
}

file0.rs

// 无需声明mod main,直接用crate::访问根模块的公共函数
pub fn testA() -> i32 {
    crate::testB() + 5
}

方案二:通过父模块共享(适合复杂项目结构)

如果你的项目模块结构更复杂,可以将两个需要互相调用的模块放在同一个父模块下,通过super::引用父模块的其他子模块。

项目结构

src/
├── main.rs
└── modules/
    ├── mod.rs
    ├── file0.rs
    └── file1.rs

代码实现

modules/mod.rs

// 声明子模块
pub mod file0;
pub mod file1;

modules/file0.rs

// 引用同目录下的file1模块
use super::file1;

pub fn testA() -> i32 {
    file1::testB() + 5
}

modules/file1.rs

use super::file0;

pub fn testB() -> i32 {
    file0::testA() - 2
}

main.rs

// 引入父模块
mod modules;

fn main() {
    println!("file0::testA() = {}", modules::file0::testA());
    println!("file1::testB() = {}", modules::file1::testB());
}

关键注意事项

  • Rust禁止循环mod声明,必须通过父模块或Crate根来建立跨模块引用;
  • 只有pub标记的函数、结构体等项才能被外部模块访问,这是Rust实现类似C++friend功能的核心方式;
  • 互相调用时要注意避免无限递归,确保逻辑有明确的终止条件。

内容的提问来源于stack exchange,提问作者Andrew Benor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:35:29