Rust模块化系统学习记录

Rust模块化系统学习记录

在这里插入图片描述

常见项目结构如图所示

Package: 可以理解为一个项目

Crate

Crate分为两种,一种是bin类型的Crate,一种是lib类型的Crate。

  1. 一个Package下只能有1个lib类型的Crate
  2. 一个Package下可以有多个bin类型的Crate
  3. 一个Package下最少有一个bin/lib类型的Crate

一个Crate(lib)下可以有多个Module,一个Module下可以嵌套多层Module

Module的创建:

方式1:

创建device.rs文件

// device.rs
// pub关键字使得属性可以被外部访问
pub struct Device {
    pub device_name: String,
    pub device_type: u8,
}

impl Device {
    pub fn open_service(&self) {
        println!("打开设备")
    }
    
    pub fn close_device(&self){
        println!("关闭设备")
    }
}

pub fn log_device_info(device: &Device) {
    println!("{},{}", device.device_name, device.device_type)
}

在同一个package中的使用

// main.rs
// 挂载device这个module到当前作用域
mod device;
// 使用use调整路径,这样可以不用写完整路径
use device::Device as Device;  // as是起别名
use device::log_device_info as log;

fn main() {
    // 使用use调整路径
    let device = Device{device_name:"device1".to_string(), device_type:2};
    device.open_service();
    device.close_device();
    log(&device);
    // 不使用use调整路径
    // let device2 = device::Device{device_name:"device2".to_string(), device_type:1};
    // device::log_device_info(&device2)
}

方式2:

新建device文件夹,在device文件夹下新建名称为mod.rs的文件。

// src/device/mod.js
pub struct Device {
    pub device_name: String,
    pub device_type: u8,
}

impl Device {
    pub fn open_service(&self) {
        println!("打开设备")
    }
    
    pub fn close_device(&self){
        println!("关闭设备")
    }
}

pub fn log_device_info(device: &Device) {
    println!("{},{}", device.device_name, device.device_type)
}

在同一package下的使用和方式1一致。

Module的嵌套:

以方式2创建的Module为例

在这里插入图片描述

// global_values.rs
pub struct GlobalValues{
    pub value1:u8,
    pub value2:String,
    pub value3:(i32,i32,i16)
}
// 在main.rs中访问global_values中的属性
// 因为global_values.rs在device文件夹下创建,所以global—values从属于device,即global_values是device的子Module

// /src/device/mod.rs
// 在此处将global_values Module 挂载到device Module中
pub mod global_values;

pub struct Device {
    pub device_name: String,
    pub device_type: u8,
}

impl Device {
    pub fn open_service(&self) {
        println!("打开设备")
    }

    pub fn close_device(&self){
        println!("关闭设备")
    }
}

pub fn log_device_info(device: &Device) {
    println!("{},{}", device.device_name, device.device_type)
}

// main.rs
mod device;
use device::global_values::GlobalValues as GlobalValues;
fn main() {
    let global = GlobalValues { value1: 2, value2: "3".to_string(), value3: (12, 22, 23) };
    println!("{},{},{:?}",global.value1, global.value2, global.value3)
}

在不同的Package中访问device Module

Step1:

​ 将device.rs所在Package的Cargo.toml作修改,添加[lib]标签

在这里插入图片描述

Step2:

在device.rs所在Package的src目录下新建lib.rs文件,结构如图所示

在这里插入图片描述

// 将device.rs暴露出去
// lib.rs文件内容
pub mod device;

Step3:

​ 在需要使用的Package中的Cargo.toml中引入device.rs所在的Package

在这里插入图片描述

Step4:

使用

// 使用use关键字导入定义的device Module
// 此处的learn_package与Step1中[lib]标签下的name保持一致
use learn_package::device;
use learn_package::device::log_device_info;

fn main() {
    println!("Hello, world!");
    let device1 = device::Device { device_name: "name".to_string(), device_type: 2 };
    log_device_info(&device1);
}
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cleaner-11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值