在Rust中自定义类型有两种方式,其一是定义结构体,其二是定义枚举,通过这两种方式来定义符合实际场景的复杂类型。
结构体的定义和使用
- 定义结构体的关键字是 struct;
- 结构体风格有C-Style,Tuple-Style和Unit-Style三种;
1. C-Style普通结构体:
定义:包含两个字段代表“坐标点结构体”;
struct Point { x: f32, y: f32, } 复制代码
创建并打印输出Point结构体,并在打印时使用两个{:?}分别代码PointX和PointY;
let point = Point { x: 10.23, y: 29.39 }; println!("Point x {:?},y{:?}", point.x, point.y); // output:Point x 10.23,y29.39 复制代码
2. 定义结构体的字段为另一个结构体:
定义:包含起点和终点两个坐标点的“线结构体”;
struct Line { start: Point, end: Point, } 复制代码
创建并打印输出Line结构体,在创建时用到了解构来简化使用,在输出时使用具名的方式来指定输出的内容;
let Line { start, end } = Line { start: Point { x: 0.00, y: 0.00 }, end: Point { x: 100.00, y: 0.00 }, }; println!( "Line start{startX:?}{startY:?},end{endX:?}end{endY:?}", startX = start.x, startY = start.y, endX = end.x, endY = end.y, ); // output:Line start0.00.0,end100.0end0.0 复制代码
3. Tuple-Style结构体:
定义:包含原点和半径的“环结构体”,其中元祖的主要特点就是可以将不同类型的数据装到一起;
struct Ring(Point, Line); 复制代码
创建并打印Ring结构体;
let Ring(_point, _line) = Ring(point, Line { start, end }); println!( "Ring {pointX:?} {pointY:?},start{startX:?} {startY:?},end{endX:?} {endY:?}", pointX = _point.x, pointY = _point.y, startX = _line.start.x, startY = _line.start.y, endX = _line.end.x, endY = _line.end.y, ); // output:Ring 10.23 29.39,start0.0 0.0,end100.0 0.0 复制代码
4. Unit-Style单元结构体
定义和创建:特点就是没有字段所以可以在需要实现一个特性但不想存储类型本身的任何数据时使用;
struct Empty; let x = Empty; println!("{:p}", &x); // output:0xca675df588 复制代码
枚举的定义和使用
定义枚举:Rust中枚举的类型由一个或多个的普通结构体,元祖结构体或单元结构体组成;
enum WebEvent { PageLoad, // 单元结构体 KeyPress(char), // 元祖结构体 Click { x: i64, y: i64 }, // 普通C-Style结构体 } 复制代码
使用别名:通过使用type关键字定义的别名来简化后续的使用;
type WE = WebEvent; 复制代码
匹配枚举:使用match来匹配后做对应处理,同时使用了use简化代码
fn inspect(event: WE) { // 通过use简化 use WebEvent::{Click, KeyPress, PageLoad}; // 匹配后做对应处理 match event { PageLoad => println!("PageLoad"), KeyPress(c) => println!("KeyPress:{}", c), Click { x, y } => { println!("x:{}, y:{}", x, y); } } } // 执行定义的函数,当定义的字段存在没有使用的情况,可以通过在文件顶部键入`#![allow(dead_code)]`来忽略编译的错误警告 inspect(WebEvent::PageLoad); inspect(WebEvent::KeyPress('a')); inspect(WebEvent::Click { x: 100, y: 200 }); 复制代码
总结:
本篇有点水了,总结了一下Rust编程语言的自定义类型的方式,主要是一些指针语法实在有点拗,下次注意~