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

时间:2019-09-20 19:40:16

标签: file import rust

C ++资深人士在Rust中尝试我的第一步。我有一个包含3个文件的小项目:

main.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);
}

person.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()
        }
    }
}

addr.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
        }
    }
}

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

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"

我真的不知道出什么问题了,这是什么?

2 个答案:

答案 0 :(得分:0)

从错误消息看来,您的addr.rs文件放在错误的位置(src / addr.rs?)。以下项目布局将起作用:

├── src
│   ├── main.rs
│   ├── person
│   │   └── addr.rs
│   └── person.rs

将:

├── src
│   ├── main.rs
│   ├── person
│   │   └── addr
│   │       └── mod.rs   <== this is addr.rs renamed
│   └── person.rs

模块是分层的,并从板条箱根src/main.rssrc/lib.rs形成一棵树。

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

mod module1

然后它期望找到名为src/module1.rssrc/module1/mod.rs的文件。

但是,如果module1引用了另一个模块module2,则该模块应该位于src/module1/module2.rs下的src/module1/module2/mod.rsmodule1中。

请参阅Rust Book中的Separating Modules into different files

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

pub mod addr;

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

let myAddr = person::addr::Addr::new();

use person::addr;
// ...
let myAddr = addr::Addr::new();

答案 1 :(得分:0)

另一个选择是use crate路径,可将文件保留在同一目录中。如果您最终想在其他模块中重用Addr而又不与person耦合,那么这可能很方便。在您的示例中,尝试以下操作。

  1. main.rs中,添加mod addr;,使addr模块对根目录可见。
  2. person.rs中,更改:
mod addr;
use addr::*;

收件人:

use crate::addr;