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

Rust模块解析疑问:b.rs中use crate::Summary为何可行?

问题描述

src目录下包含三个文件:main.rs、a.rs、b.rs,代码内容如下:

main.rs

mod a;
mod b;

use crate::a::Summary;
use crate::b::Person;

fn main() {
    let p = Person{ first: "John".to_string(), last: "Doe".to_string() };
    sum(p);
}

fn sum(summary: impl Summary) {
    println!("{}", summary.summarize());
}

a.rs

pub trait Summary {
    fn summarize(&self) -> String;
}

b.rs

use crate::Summary;

pub struct Person {
    pub first: String,
    pub last: String,
}

impl Summary for Person {
    fn summarize(&self) -> String {
        format!("{}, {}.", self.last, self.first)
    }
}

疑问:b.rs中的use crate::Summary;为何没有引发错误?按照逻辑应该写成use crate::a::Summary;或者use super::a::Summary;,但该语句却能正常工作,是否存在特殊的底层搜索逻辑?


解答

按照你给出的代码,use crate::Summary;实际上会触发编译错误——Summary trait定义在crate::a子模块中,根模块(main.rs)并没有将它暴露到自身的公共命名空间,编译器会提示no Summary in the root module。

如果你的代码确实能正常编译运行,大概率是你在main.rs中额外添加了**重导出(re-export)**代码:

mod a;
mod b;

// 这行将a模块的Summary重导出到根模块的公共命名空间
pub use a::Summary;

use crate::a::Summary;
use crate::b::Person;

// ... 其余代码不变

用pub use a::Summary;时,相当于把a模块里的Summary“映射”到了根模块下,此时crate::Summary就等价于crate::a::Summary,b.rs的导入语句自然能正常工作。

此外还有两种小概率可能:

  • 你误将a.rs的内容直接写在了main.rs中,此时Summary本身就位于根模块;
  • 你的项目是库项目(存在lib.rs),且lib.rs中做了pub use a::Summary;的重导出,main.rs依赖了该库 crate。

内容的提问来源于stack exchange,提问作者John Caruso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:15:58