【RUST学习日记】第10课 复合数据类型

简介: 【RUST学习日记】第10课 复合数据类型

0x00 回顾


上一节主要讲解了println的常见用法,这节咱们继续学习数据类型,距离上次的讲解基本数据类型隔了好久了。哈哈,是不是已经迫不及待了。复合数据类型(Compound Types)一般指由其他数据类型组合而成的类型。Rust原始的复合数据类型有数组,元组。


0x01 数组(Array)


数组是由相同类型的元素组合而成的复合类型。数组的长度是固定的,一旦声明,其长度不能增长或者缩小。


数组声明


在Rust中数组的类型签名为:[T;N]T表示数据类型,N表示数组的长度,编译时必须确定其大小。数组有以下两种初始化方式:

1、中括号中列举所有的值,其中的值以英文逗号隔开。示例代码如下:

// 未声明类型
    let a = [1, 2, 3, 4, 5];
    // 声明类型
    let b: [i32; 5] = [1, 2, 3, 4, 5];

2、中括号中,第一个值表示默认初始元素,第二个值表示长度,中间使用英文分号;隔开。示例代码如下:

// 未声明类型
    let c = [2; 5];
    // 声明类型
    let d: [i32; 5] = [2; 5];

上面的代码表示,初始化一个长度为5的数组,且每个元素的初始值指定为2。


数组访问


在Rust中可以通过“数组名称[索引]”来访问数组中响应位置的元素。索引值从0开始计数。示例代码如下:

let e = [2, 4, 6, 8, 10];
    println!("数组e第三个位置的元素是 {}", e[2])

代码执行结果:

数组e第三个位置的元素是 6


数组越界


由于数组的长度是固定,如果访问时索引值超出数组的长度就会产生数组越界(Index Out Of Bounds)。数组的长度可以使用len()函数获取。下方的代码会输出长度为5:

let f = [1, 3, 5, 7, 9];
    println!("f数组的长度是 {}", f.len());
    // 下面的代码会发生数据越界
    println!("{}", f[5]);

上面的代码执行println!("{}", f[5]);时会发生数组越界,报错信息如下。虽然说Rust的一门安全的语言,但是数据越界的问题还是无法避免的。


0a2653c851af460fa595bd959398a8f1.png

 

0x02 元组(Tuple)


元组是有一个或多个类型的元素组合而成的复合类型。官方没有给出明确定义。在使用过程中,元组通常至少包含两个元素。当然元组只包含一个元素也可以,没有元素也是可以的。


元组声明


元组是一种异构有限的序列。异构表示元组内的元素可以是不同类型的。有限是指元组的长度是固定的。元组的签名格式为:(T,U,M),T,U,M均表示类型。示例代码如下:

let tup: (i32, f64, bool) = (20, 3.14, false);  
    // 一个元素的元组
    let tup_single: (i32, ) = (5, );
    // 下面两种方式不是一个元组
    // 他们等价于 let tup_wrong = 5;
    // let tup_wrong = (5);
    // let tup_wrong: (i32) = (5);
    dbg!(tup_single);
    // 空元组
    let empty_tup = ();
    dbg!(empty_tup);

上面代码中,如果要声明只有一个元素的元组,则需要在元素后面加一个英文逗号。let tup_wrong = (5)这不是一个元组,相当于let tup_wrong = 5。空元组表示为(),不占任何内存空间,了解即可。


元组索引


元组默认是通过使用“元组名称.索引”来访问元组中相应位置的元素。示例代码如下:

let tup : (i32, f64, bool) = (20, 3.14, false);
println!("{} {} {} ", tup.0, tup.1, tup.2);


元组解构(Destructure)


元组是一个单独的复合元素,除了通过索引的方式去获取元组内的某个值,还可以使用模式匹配(Pattern Matching)的方式来解构(Destructure)元组。通常使用let + 模式来进行解构元组。示例代码如下:

let tup : (i32, f64, bool) = (20, 3.14, false);
    let (x, y, z) = tup;
    println!("x: {}, y: {}, z: {}", x, y, z);

代码执行结果:

x: 20, y: 3.14, z: false

首先创建一个元组tup变量,然后使用let+模式将tup分为3个变量xyz。这个过程就叫做元组的解构(Destructure)。

PS:let除了可以绑定变量,还支持模式匹配。关于模式匹配将会在后续章节介绍。


0x03 小结


这节课了解了Rust的原始复合数据类型数组元组。这节课简单讲解了下数组,在下节课的“向量”讲解中还会进行一次详细的介绍。可能你在浏览其它文章时发现复合数据类型还有结构体,枚举等等,后面会再详细介绍。这节讲的数组元组,以及第6课讲的标量数据类型——整数型,浮点型,布尔型,字符型这些数据类型的值都是直接保存在“栈”中。它们没有所有权的概念。所有权是Rust的重要知识点之一。关于栈和所有权的知识也会在后续章节介绍。

相关文章
|
5月前
|
存储 Rust 程序员
Rust中数据类型详解:从整数到字符串
本文将详细解析Rust编程语言中的基本数据类型,包括整数、浮点数、布尔值、字符与字符串。我们将深入探讨每种数据类型的特性、使用场景以及它们在Rust中的实现方式,帮助读者更好地理解和应用这些基础元素。
|
4天前
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
28 8
|
5天前
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
13 2
|
5天前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
17 1
|
17天前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
10 0
|
1月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
72 2
|
1月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
21 1
|
1月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
2月前
|
存储 Rust 安全
【Rust学习】06_切片
所有权、借用和切片的概念确保了 Rust 程序在编译时的内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。
21 1
|
3月前
|
存储 Rust 安全
【Rust学习】04_所有权
所有权是 Rust 最独特的特性,对语言的其余部分有着深远的影响。它使 Rust 能够在不需要垃圾收集器的情况下保证内存安全,因此了解所有权的运作方式非常重要。在本章中,我们将讨论所有权以及几个相关功能:借用、切片以及 Rust 如何在内存中布局数据。
21 1