注意事项
- mod 如果要使用,需要加 pub 前缀
- mod 中如果要引用标准库中的 mod 时, use 语法需要写到 mod 的内部,切记不要写到外部
- 要使用一个 mod 时,首先需要
mod worker;
来将其引入到全局的 crate 中 (这里是 lib.rs) , - 然后再引用 mod
use crate::worker
; - 如果你要使用
worker
文件夹下面的worker
这个 mod, 那么就需要这样写了use crate::worker::worker
;
定义一个 mod
// 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 }
}
}
}
在其他文件中使用它
// lib.rs
mod worker;
use std::thread;
use crate::worker::worker::*;
pub struct ThreadPool {
workers: Vec<Worker>,
}
如果已经在 crate 中进行了 mod worker; 的引用 那么其他非 crate 的文件(必须也在 crate 中进行引用过),
只需要通过 下面代码即可以使用
// src/job.rs
use crate::worker::worker::*;
注意 这里的 job.rs 必须已经在 crate 也就是 lib.rs 中引用了
// src/lib.rs
mod job;
总结
其实正如官方文档描述的一样,mod 类似于一个 tree,我们必须要在 tree 的顶端引入每个需要使用的 mod,也就是 mod job;
这样才能让 src/job.rs
这个文件被编辑器识别,然后在其他文件中就可以通过 use crate::job
来访问了
如果仅仅是像 js 一样用于拆分文件,而不是在每个文件中实现多个 mod 的话, 其实 worker.rs
里面的内容可以这样写
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 }
}
}
然后这样引用
use std::thread;
use crate::worker::*;