Rust 中的包的使用,以及将包分为多个文件模块

在 main.rs 中创建一个模块

例子如下:

mod geometry {

    #[derive(Debug)]
    #[derive(Default)]
    pub struct Box {
        pub width: f64,
        pub height: f64,
        pub length: f64,
    }
    
    impl Box {
        pub fn new(width: f64, height: f64, length: f64) -> Self {
            Self {
                width,
                height,
                length,
            }
        }
        
        pub fn get_volume(&self) -> f64 {
            self.width * self.height * self.length
        }
    }
}


fn main() {
    let box1 = geometry::Box::new(23.3, 231.2, 443.4);
    println!("{:?}", box1);
    println!("The volume of box1 is: {:.3}", box1.get_volume());

    let box2 = geometry::Box::default();
    println!("{:?}", box2);
    println!("The volume of box2 is: {:.3}", box2.get_volume());
}

模块的特点:

  • 如果要在模块外进行访问则需要在对应函数名或结构体等前面加上 pub 关键字
  • 模块的名字应该使用全小写加下划线的规范

这是第一种使用模块的方式;第二种方式下面将介绍在 src 文件夹下建一个 geometry.rs 的文件来保存模块。

在 src 下创建 geometry.rs 文件

目录结构:

zsf@xiaotupo:~/code/rust_examples/helloworld$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── geometry.rs
    └── main.rs

1 directory, 4 files

main.rs

我们在 main.rs 文件中用 mod geometry 来定义一个模块,这个模块就是 src 文件夹下面的同名文件 geometry.rs, 并且该文件内部无需在次使用 mod 关键字来定义模块。

mod geometry;


fn main() {
    let box1 = geometry::Box::new(23.3, 56.3, 36.5);
    println!("box1: width: {}, height: {}, length: {}", box1.width, box1.height, box1.length);
    println!("The volume of box1 is: {:.3}", box1.get_volume())
}

geometry.rs

该文件中的内容如下:

#[derive(Debug)]
#[derive(Default)]
pub struct Box {
    pub width: f64,
    pub height: f64,
    pub length: f64,
}

impl Box {
    pub fn new(width: f64, height: f64, length: f64) -> Self {
        Self {
            width,
            height,
            length,
        }
    }
    
    pub fn get_volume(&self) -> f64 {
        self.width * self.height * self.length
    }

}

在 src 文件夹下简历 geometry 目录

目录结构:

zsf@xiaotupo:~/code/rust_examples/helloworld$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── geometry
    │   ├── box.rs
    │   └── mod.rs
    └── main.rs

2 directories, 5 files

main.rs 文件

mod geometry;


fn main() {
    let box1 = geometry::Box::new(23.3, 56.3, 36.5);
    println!("box1: width: {}, height: {}, length: {}", box1.width, box1.height, box1.length);
    println!("The volume of box1 is: {:.3}", box1.get_volume())
}

mod.rs 文件

mod r#box;

pub use r#box::Box;

box.rs


#[derive(Debug)]
#[derive(Default)]
pub struct Box {
    pub width: f64,
    pub height: f64,
    pub length: f64,
}

impl Box {
    pub fn new(width: f64, height: f64, length: f64) -> Self {
        Self {
            width,
            height,
            length,
        }
    }
    
    pub fn get_volume(&self) -> f64 {
        self.width * self.height * self.length
    }

}
posted @ 2023-08-13 13:35  小土坡  阅读(252)  评论(0编辑  收藏  举报