0%

Rust 中 mod 的使用

注意事项

  1. mod 如果要使用,需要加 pub 前缀
  2. mod 中如果要引用标准库中的 mod 时, use 语法需要写到 mod 的内部,切记不要写到外部
  3. 要使用一个 mod 时,首先需要 mod worker; 来将其引入到全局的 crate 中 (这里是 lib.rs) ,
  4. 然后再引用 mod use crate::worker;
  5. 如果你要使用 worker 文件夹下面的 worker 这个 mod, 那么就需要这样写了 use crate::worker::worker;

定义一个 mod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// src/worker.rs
pub mod worker {
use std::thread;

pub struct Worker {
id: usize,
thread: thread::JoinHandle<()>,
}

impl Worker {
pub fn new(id: usize) -> Worker {
let thread = thread::spawn(|| {});

Worker { id, thread }
}
}
}

在其他文件中使用它

1
2
3
4
5
6
7
8
//  lib.rs
mod worker;
use std::thread;
use crate::worker::worker::*;

pub struct ThreadPool {
workers: Vec<Worker>,
}

如果已经在 crate 中进行了 mod worker; 的引用 那么其他非 crate 的文件(必须也在 crate 中进行引用过),

只需要通过 下面代码即可以使用

1
2
// src/job.rs
use crate::worker::worker::*;

注意
这里的 job.rs 必须已经在 crate 也就是 lib.rs 中引用了

1
2
// src/lib.rs
mod job;

总结

其实正如官方文档描述的一样,mod 类似于一个 tree,我们必须要在 tree 的顶端引入每个需要使用的 mod,也就是 mod job;

这样才能让 src/job.rs 这个文件被编辑器识别,然后在其他文件中就可以通过 use crate::job 来访问了

如果仅仅是像 js 一样用于拆分文件,而不是在每个文件中实现多个 mod 的话, 其实 worker.rs 里面的内容可以这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use std::thread;

pub struct Worker {
id: usize,
thread: thread::JoinHandle<()>,
}

impl Worker {
pub fn new(id: usize) -> Worker {
let thread = thread::spawn(|| {});

Worker { id, thread }
}
}

然后这样引用

1
2
use std::thread;
use crate::worker::*;