最近在用 Rust 写一个课程项目,网上没有找到很好的文章说明如何引用文件,这里做一个简单的笔记。
mod
引入本地文件比如说,我现在通过 cargo new
创建一个项目,然后我新建了一个 cache.rs
文件,和main.rs
同级,里面定义了一个结构体以及相关的函数
pub struct Cache {}
impl Cache {
pub fn new() -> Cache {
return Cache {};
}
pub fn set(&mut self, _key: String, _value: String) {}
pub fn get(&mut self, _key: &String) -> String {
return "".to_string();
}
}
现在我想要在 main.rs
中引用其中定义的结构体,比如这样
let mut c = cache::Cache::new();
c.set(String::from("key"), String::from("value"));
其实很简单,在 main.rs
中声明 mod cache;
就 OK 了, main.rs
的最终代码就是这样了,也就多了一行代码,如果我们想要引入其他的文件,其实都是一样的,多加几个 mod
声明就好了,不过需要注意需要导出的定义需要加 pub
声明。
mod cache;
fn main() {
let mut c = cache::Cache::new();
c.set(String::from("key"), String::from("value"));
}
但是如果说 cache.rs
属于 cache
目录下呢,目录结构像这样:
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── cache
│ │ └── cache.rs
│ └── main.rs
这样应该如何处理呢?其实,操作比较类似,但是我们需要在 cache
目录下建立一个 mod.rs
(Rust中的一个特殊文件) 用于模块的声明,就相当于声明 cache
这个目录下有哪一些模块。
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── cache
│ │ ├── cache.rs
│ │ └── mod.rs
│ └── main.rs
因为我们这个模块里面可能会存在一些私有模块,不想导出,那么我们不声明为 pub
即可,这里我们需要导出 cache.rs
中的定义,所以 mod.rs
中的内容应该为 pub mod cache;
, 然后在 main.rs
中同样声明 mod cache
;
但是这样你会发现,在 main.rs
中想要引入 strcut Cache
的时候需要使用 cache::cache::Cache::new()
,这是因为我们这种形式的声明相当于:
mod cache {
mod cache {
pub struct Cache{}
}
}
这使用起来就不太友好了,针对这种情况,我们可以在 cache/mod.rs
中对定义的变量进行重导出,其实就是添加了一句话:
pub use cache::Cache;
我们可以简单的认为相当于将 Cache 提升了一层,变成了下面的情况,但是在 main.rs
中还是可以通过 cache::cache::Cache
进行访问
mod cache{
mod cache{
pub struct Cache;
}
pub struct Cache;
}
use
引入本地的 lib
比如我现在需要复用另外一个本地已经包装好的库,而不是引入文件,比如说他们的位置如下,lib 包的位置也可以提到外面去,操作类似。
├── Cargo.lock
├── Cargo.toml
├── cache # 本地 lib
│ ├── Cargo.toml
│ └── src
│ └── lib.rs # struct Cache 移到这里
├── src
│ ├── cache
│ │ ├── cache.rs
│ │ └── mod.rs
│ └── main.rs
那么我们需要需要在 Cargo.toml
中引入 cache lib
,具体写法如下:
# 名字: 需要和 lib 库中 Cargo.toml 中定义的 name 一致
# path: 指定路径 (相对于根项目的Cargo.toml)
cache = { path = "./cache" }
然后就可以和使用其他的第三方库一样使用 cache
库了
当然上面的这种写法是建立在将 struct Cache
写到 lib.rs
文件中的,不过我们可以新建一个文件 cache.rs
,然后在 lib.rs
中引入
mod cache;
pub use cache::Cache;
想要看看源码怎么使用的同学,可以看看我写的一个简陋的 HTTP代理项目