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"
我真的不知道出什么问题了,这是什么?
答案 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.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中的Separating Modules into different files。
要使main.rs
也使用Addr
,person.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
耦合,那么这可能很方便。在您的示例中,尝试以下操作。
main.rs
中,添加mod addr;
,使addr
模块对根目录可见。person.rs
中,更改:mod addr;
use addr::*;
收件人:
use crate::addr;