Не могу импортировать файл в другой файл в Rust - PullRequest
1 голос
/ 20 сентября 2019

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 голосов
/ 21 сентября 2019

Другим вариантом является путь use crate для хранения файлов в том же каталоге.Это может быть удобно, если вы в конечном итоге захотите повторно использовать Addr в других модулях без привязки к person.В вашем примере попробуйте следующее.

  1. В main.rs, добавьте mod addr;, чтобы сделать модуль addr видимым для корня.
  2. В person.rs, измените:
mod addr;
use addr::*;

до:

use crate::addr;
0 голосов
/ 20 сентября 2019

Из сообщения об ошибке похоже, что ваш файл 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.rs, либо src/lib.rs.

Корень ящика может ссылаться на модуль, который объявлен в другом файле, например,

mod module1

Затем он ожидает найти файл с именем src/module1.rs или src/module1/mod.rs.

Но если module1 ссылается на другой модуль, module2, ожидается, что он будет либо src/module1/module2.rs, либо src/module1/module2/mod.rs, вложенным в module1.

См. Разделение модулей на разныефайлы в Rust Book.

Чтобы main.rs также использовал Addr, person.rs необходимо объявить модуль addr общедоступным:

pub mod addr;

Тогда main.rs может ссылаться на него как:

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

или

use person::addr;
// ...
let myAddr = addr::Addr::new();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...