当前位置:网站首页>Rust从入门到精通04-数据类型
Rust从入门到精通04-数据类型
2022-08-09 12:04:00 【51CTO】
Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型。
在 Rust 中,每一个值都属于某一个 数据类型(data type),分为两大类:
①、标量(scalar):整型、浮点型、布尔类型、字符类型
②、复合(compound):元祖(tuple)、数组(array)、结构体(struct)
1、标量scalar
每个类型有一个单独的值。
1.1 整型
表示没有小数部分的数字,分为有符号(以 i 开头)和无符号(以 u 开头)整型。
数字类型的默认类型是 i32。
长度 | 有符号 | 无符号 |
8-bit | | |
16-bit | | |
32-bit | | |
64-bit | | |
128-bit | | |
arch | | |
每一个有符号的整型可以储存包含从 -(2^{n - 1}) 到 2^{n - 1} - 1 在内的数字,这里 n 是整型定义的长度。所以 i8
可以储存从 -2^7到 2^7 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2^{n - 1} 的数字,所以 u8
可以储存从 0 到 2^8 - 1 的数字,也就是从 0 到 255。
另外,isize
和 usize
类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的, 32 位架构上它们是 32 位的。
1.1.1 所有数字字面量,可以在任意地方添加下划线_
1.1.2 字面量可以跟类型后缀,表示数字具体类型
1.1.3 直接对整型字面量调用函数
1.1.4 整数溢出
Rust 对于整数溢出的处理方式如下: ①、默认情况下,在debug模式下编译器会自动插入整数溢出检查,一旦发生溢出,则会引发 panic; ②、在 release 模式下,不检查整数溢出,而是自动舍弃高位的方式。
1.1.5 如何选择
通常默认类型 i32 即可,它通常是最快的。
1.2 浮点
Rust 有两个原生的 浮点数(floating-point numbers)类型,它们是带小数点的数字。是基于 IEEE 754-2008 标准的浮点类型,分别是 f32
和 f64
,分别占 32 位和 64 位。默认类型是 f64
,因为在现代 CPU 中,它与 f32
速度几乎一样,不过精度更高。
1.3 布尔类型
布尔类型(bool)代表的是“是”和“否”的二值逻辑。它有两个值:
true和false
一般用在逻辑表达式中,可以执行“与”“或”“非”等运算。
1.4、字符类型
字符类型由 char 表示。它可以描述任何一个符合 unicode 标准的字符值。在代码中,单个的字符字面量用单引号包围(不同于字符串用):
1.4.1 4个字节字符
因为 char 类型的设计目的是描述任意一个 unicode 字符,因此它占据的内存空间不是1个字节,而是 4 个字节。
这意味着它可以比 ASCII 表示更多内容。在 Rust 中,拼音字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char
值。Unicode 标量值包含从 U+0000
到 U+D7FF
和 U+E000
到 U+10FFFF
在内的值。
1.4.2 1个字节字符-u8
let x : u8 = 1;
对于 ASCII 字符其实只需要占据一个字节的空间,因此Rust 提供了单字节字符字面量来表示 ASCII 字符。
注意:我们还可以通过一个字母 b 在字符或者字符串前面,代表这个字面量存储在 u8 类型数组中,这样占用空间比 char 型数组要小一些。
let x : u8 = 1; let y : u8 = b'A';
2、复合compound
复合类型(Compound types)可以将多个值组合成一个类型
2.1 元祖(tuple)
①、由圆括号()包含一组表达式组成;
②、长度固定,一旦声明,其长度不会增大或缩小。
③、rust中可以存放不同类型的数据类型
2.1.2 实例
2.1.3 如果元祖只有一个元素,应该添加一个逗号,用来区分括号表达式和元祖
2.1.4 访问元祖元素
①、模式匹配解构
②、数字索引
2.2 数组(array)
①、由中括号[] 包含一组表达式组成;
②、数组中每个元素的类型必须相同(元祖tuple可以不同);
③、长度固定,一旦声明,其长度不会增大或缩小。
2.2.1 实例
有三种方式声明。
2.2.2 访问数组元素
①、通过下标访问
初始下标是0
②、通过 get() 方法
注意返回值是 Option<T>
2.2.3 数组越界访问异常
如果声明的数组有4个,但是访问下标大于或等于4,则会在运行时抛出异常(编译能过)。
2.2.4 避免数组越界程序崩溃
如果我们不确定读取数组的索引是否合法,上面通过索引的方式访问就会发生异常,导致程序奔溃。
为了避免这种情况,我们可以使用 get(index) 的方法来获取数组中的元素,其返回值是 Option<T>
2.3 结构体(struct)
结构体和元祖类似,都可以把多个类型组合到一起,作为新的类型。 结构体又可以分为三种具体类型:
2.3.1 具名结构体
①、每个元素之间采用逗号分开,最后一个逗号可以省略不写。 ②、类型依旧跟在冒号后面,但是不能使用自动类型推导功能,必须显示指定。
局部变量和结构体变量一致,可以省略掉重复的冒号初始化
2.3.2 元祖结构体tuple struct
这是前面介绍的 tuple 和 struct 两种类型的混合,tuple struct 结构有名字,但是成员没有名字。
名字加圆括号,类型有单独的名字,成员没有单独的名字。
访问方法
通过下标访问:
2.3.3 单元结构体
单元结构体不会占用任何内存空间。
3、枚举 enum
如果说 tuple、struct、tuple struct 在 Rust 中代表的是多个类型的“与”关系,那么 enurn类型在 Rust 中代表的就是多个类型的“或”关系。
Rust 的 enurn 中的每个元素的定义语法与 struct 的定义语法类似。可以像空结构体一样,不指定它的类型;也可以像 tuple struct 一样,用圆括号加无名成员;还可以像正常结构体一样,用大括号加带名字的成员。
4、特殊数据类型
4.1 Never 类型
表示不可能返回值的数据类型。
①、类型理论中,叫做底类型,底类型不包含任何值,但它可以合一到任何其它类型;
②、Never 类型用感叹号“!" 表示;
③、目前还未稳定,但是rust内部已经开始用了。
5、常见错误
5.1 类型转换必须通过 as 关键字显式声明
报错如下:
增加 as 关键字显示声明即可。
5.2 复合数据类型允许递归,但是不允许直接嵌套
报错如下:
边栏推荐
- 【Untitled】
- 合并两个有序列表
- Adalvo acquires its first branded product, Onsolis
- 研发需求的验收标准应该怎么写? | 敏捷实践
- API调用,API传参,面向对接开发,你真的会写接口文档吗?
- 苹果Meta都在冲的Pancake技术,中国VR团队YVR竟抢先交出产品答卷
- 1-hour live broadcast recruitment order: industry big names share dry goods, and enterprise registration opens丨qubit·viewpoint
- 我们真的需要DApp吗?App真的不能满足我们的幻想吗?
- Gumbel_Softmax 概要
- 基于CAP组件实现补偿事务与幂等性保障
猜你喜欢
程序员的专属浪漫——用3D Engine 5分钟实现烟花绽放效果
问题来了:4GB物理内存的机器上申请8G内存能成功吗?
WeChat side: what is consistent hashing, usage scenarios, and what problems does it solve?
【无标题】
Senior told me that the giant MySQL is through SSH connection
HAproxy: load balancing
h264 protocol
告别手摇织布机的AI时代
箭头函数和普通函数的常见区别
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
随机推荐
已解决IndentationError: unindent does not match any oute r indentation Level
1-hour live broadcast recruitment order: industry big names share dry goods, and enterprise registration opens丨qubit·viewpoint
金融业“限薪令”出台/ 软银出售过半阿里持仓/ DeepMind新实验室成立... 今日更多新鲜事在此...
FFmpeg在win10上编译安装(配置libx264)
你没见过的《老友记》镜头,AI给补出来了|ECCV 2022
GET请求和POST请求区别
26、管道参数替换命令xargs
h264协议
GRPC整体学习
用 API Factory 产品生成 API 文档
链表噩梦之一?5000多字带你弄清它的来龙去脉
一甲子,正青春,CCF创建六十周年庆典在苏州举行
Adalvo acquires its first branded product, Onsolis
We really need DApp?Really can't meet our fantasy App?
The redis library cannot be imported
研发需求的验收标准应该怎么写? | 敏捷实践
Ways to prevent data fraud
API调用,API传参,面向对接开发,你真的会写接口文档吗?
Modify the VOT2018.json file and remove the color in the image path
超越CLIP的多模态模型,只需不到1%的训练数据!南加大最新研究来了