Rust 中无法将一个文件导入到另一个文件中

Rod*_*igo 5 import file rust

C++ 老手正在尝试 Rust 的第一步。我有一个包含 3 个文件的小项目:

主程序.rs

mod person;
use person::*;

fn main() {
    let mut pp = Person::new(); // Person struct used here
    pp.name = "Malcolm".to_string();
    println!("{}, {}, {}",
        pp.name, pp.place.street, pp.place.number);
}
Run Code Online (Sandbox Code Playgroud)

人.rs

mod addr;
use addr::*;

pub struct Person {
    pub name: String,
    pub place: addr::Addr // Addr struct used here
}

impl Person {
    pub fn new() -> Self {
        Self {
            name: "John".to_string(),
            place: addr::Addr::new()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

地址.rs

pub struct Addr { // won't use any other struct
    pub street: String,
    pub number: i32
}

impl Addr {
    pub fn new() -> Self {
        Self {
            street: "Boulevard".to_string(),
            number: 33
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当尝试编译时,我收到以下错误消息:

error[E0583]: file not found for module `addr`
--> src/person.rs:1:5
|
1 | mod addr;
|     ^^^^
|
= help: name the file either person/addr.rs or person/addr/mod.rs inside the directory "src"
Run Code Online (Sandbox Code Playgroud)

我实在搞不明白到底出了什么问题,到底是什么?

cod*_*key -1

从错误消息来看,您的 addr.rs 文件似乎位于错误的位置(src/addr.rs?)。以下项目布局可行:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 person\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 addr.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 person.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 person\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 addr\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mod.rs   <== this is addr.rs renamed\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 person.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

模块是分层的,并从 crate 根部形成一棵树,或者src/main.rssrc/lib.rs

\n\n

板条箱根可以引用在另一个文件中声明的模块,例如

\n\n
mod module1\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后它期望找到一个名为src/module1.rs或 的文件src/module1/mod.rs

\n\n

但如果module1引用另一个模块 ,module2则预计它位于src/module1/module2.rs或 中src/module1/module2/mod.rs,嵌套在 下module1

\n\n

请参阅Rust Book 中的将模块分离到不同的文件中。

\n\n

为了main.rs也使用Addrperson.rs需要将addr模块声明为 public:

\n\n
pub mod addr;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后main.rs可以像这样引用它:

\n\n
let myAddr = person::addr::Addr::new();\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
use person::addr;\n// ...\nlet myAddr = addr::Addr::new();\n
Run Code Online (Sandbox Code Playgroud)\n