Rust 引入其他的 rs 文件

Rust 中如何引入其他的 rs 文件 ?

最近在用 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代理项目

你可能感兴趣的:(Rust,rust,开发语言)