File 无法将文件导入到Rust中的其他文件中

File 无法将文件导入到Rust中的其他文件中,file,import,rust,File,Import,Rust,C++老手正在尝试我在Rust中的第一步。我有一个包含3个文件的小项目: 梅因 人事费 地址 但是,在尝试编译时,我收到以下错误消息: 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 dire

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

梅因

人事费

地址

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

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"

我真的搞不清楚出了什么问题,是什么问题?

从错误消息中,您的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/module1.rs或src/module1/mod.rs的文件

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

请看铁锈书

为了让main.rs也使用Addr,person.rs需要将Addr模块声明为public:

pub mod addr;
然后main.rs可以像这样引用它:

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


从错误消息看,您的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/module1.rs或src/module1/mod.rs的文件

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

请看铁锈书

为了让main.rs也使用Addr,person.rs需要将Addr模块声明为public:

pub mod addr;
然后main.rs可以像这样引用它:

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

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

在main.rs中,添加mod addr;使addr模块对root用户可见。 以个人名义,更改: 致:

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

在main.rs中,添加mod addr;使addr模块对root用户可见。 以个人名义,更改: 致:


为什么我不能将所有3个文件都放在同一个目录中?如果main.rs还实例化了Addr类型的对象怎么办?@Rodrigo请阅读它有所有答案。@Rodrigo,这是因为每个模块只能在某些位置拥有模块。main.rs、lib.rs和mod.rs-s都可以拥有它们所在的直接目录中的任何文件,或者拥有_module/mod.rs的/name_中的另一个模块。这意味着在foo.rs或./foo/mod.rs旁边可以有main.rs。这篇文章中提到了一个新特性,它允许一个模块拥有以它命名的文件夹中的任何其他模块。如果我们以上面的./foo.rs为例,foo.rs可以拥有./foo/bar.rs。为什么我不能将所有3个文件都放在同一个目录中?如果main.rs还实例化了Addr类型的对象怎么办?@Rodrigo请阅读它有所有答案。@Rodrigo,这是因为每个模块只能在某些位置拥有模块。main.rs、lib.rs和mod.rs-s都可以拥有它们所在的直接目录中的任何文件,或者拥有_module/mod.rs的/name_中的另一个模块。这意味着在foo.rs或./foo/mod.rs旁边可以有main.rs。这篇文章中提到了一个新特性,它允许一个模块拥有以它命名的文件夹中的任何其他模块。如果我们以上述./foo.rs为例,foo.rs可以拥有./foo/bar.rs。
use person::addr;
// ...
let myAddr = addr::Addr::new();
mod addr;
use addr::*;
use crate::addr;