Rust模块化系统学习记录
常见项目结构如图所示
Package: 可以理解为一个项目
Crate:
Crate分为两种,一种是bin类型的Crate,一种是lib类型的Crate。
- 一个Package下只能有1个lib类型的Crate
- 一个Package下可以有多个bin类型的Crate
- 一个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);
}