Rust编程语言中的定义类型
2023-02-18 16:41:26 时间
Dear,大家好,我是“前端小鑫同学”,?长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 在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编程语言的自定义类型的方式,主要是一些指针语法实在有点拗,下次注意~
相关文章
- 【一】知识图谱基础概念、开发流程以及落地策略
- 火遍外网的Keychron测评,带你入坑;ps马上5.20了送一个给你的心爱的她/他。
- 做知识图谱遇到的环境问题合集【spacy、gensim、keras_contrib等】
- 知识图谱项目实战(一):瑞金医院MMC人工智能辅助构建知识图谱--初赛实体识别【1】
- Jupyter Notebook 下 import 第三方库,显示 no module xxx 【本质是环境没有切换过来】
- 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?
- 总结一下强化学习在工业界应用,给大家扩展一下思路(简易科普)
- conda创建虚拟环境后文件夹中只有conda-meta文件夹,无法将环境添加到IDE中
- 百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]
- PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】
- salesforce零基础学习(一百二十三)Transaction Security 浅入浅出
- Winforms Cefsharp应用通过Vs Installer安装,应用崩溃,缺少文件错误
- Winform Vs Installer之添加自定义安装流程
- 网页唤起Winform窗体通过非IE浏览器
- Java程序员除了做增删改查还能干嘛?
- PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】
- 百度地图使用记录
- “数智化” 时代,房企的数字化转型之路
- PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】
- 快递单中抽取关键信息【一】----基于BiGRU+CR+预训练的词向量优化