Redian新闻
>
Rust 基础系列 #4: Rust 中的数组和元组 | Linux 中国

Rust 基础系列 #4: Rust 中的数组和元组 | Linux 中国

科技
 
导读:在 Rust 系列的第四篇中,学习复合数据类型、数组和元组。                           
本文字数:4119,阅读时长大约:5分钟

在 Rust 系列的第四篇中,学习复合数据类型、数组和元组。

在上一篇文章中,你学习到了 Rust 中的 标量数据类型🔗 linux.cn。它们是整型、浮点数、字符和布尔值。

在本文中,我们将会看看 Rust 编程语言中的复合数据类型。

Rust 中的复合数据类型是什么?

复合数据类型可以在一个变量中存储多个值。这些值可以是相同的标量数据类型,也可以是不同的标量数据类型。

Rust 编程语言中有两种这样的数据类型:

◈ 数组(Array):存储相同类型的多个值。
◈ 元组(Tuple):存储多个值,可以是相同的类型,也可以是不同的类型。

让我们了解一下它们吧!

Rust 中的数组

Rust 编程语言中的数组具有以下特性:

◈ 每一个元素都必须是相同的类型
◈ 数组有一个固定的长度
◈ 数组存储在堆栈中,即其中存储的数据可以被 迅速 访问

创建数组的语法如下:

  1. // 无类型声明
  2. let variable_name = [element1, element2, ..., elementn];
  3. // 有类型声明
  4. let variable_name: [data_type; array_length] = [element1, element2, ..., elementn];

数组中的元素是在方括号中声明的。要访问数组的元素,需要在方括号中指定要访问的索引。

来让我们看一个例子来更好地理解这个。

  1. fn main() {
  2. // 无类型声明
  3. let greeting = ['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!'];
  4. // 有类型声明
  5. let pi: [i32; 10] = [1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
  6. for character in greeting {
  7. print!("{}", character);
  8. }
  9. println!("\nPi: 3.1{}{}{}{}", pi[0], pi[1], pi[2], pi[3]);
  10. }

这里,我定义了一个字符数组和另一个存储 i32 类型的值的数组。greeting 数组以单独字符的形式存储了字符串 "Hello world!" 的字符。pi 数组以单独数字的形式存储了圆周率小数点后的前 10 位数字。

然后,我使用 for 循环打印了 greeting 数组的每个字符。(我很快就会讲到循环。)然后,我打印了 pi 数组的前 4 个值。

  1. Hello world!
  2. Pi: 3.11415

如果你想创建一个数组,其中每个元素都是 y,并且出现 x 次,你可以使用以下快捷方式在 Rust 中实现:

  1. let variable_name = [y; x];

来看一个演示……

  1. fn main() {
  2. let a = [10; 5];
  3. for i in a {
  4. print!("{i} ");
  5. }
  6. println!("");
  7. }

我创建了一个变量 a,它的长度为 5。数组中的每个元素都是 '10'。我通过使用 for 循环打印数组的每个元素来验证这一点。

它的输出如下:

  1. 10 10 10 10 10

🤸 作为练习,尝试创建一个长度为 x 的数组,然后尝试访问数组的第 x+1 个元素。看看会发生什么。

Rust 中的元组

Rust 中的元组具有以下特性:

◈ 就像数组一样,元组的长度是固定的
◈ 元素可以是相同的/不同的标量数据类型
◈ 元组存储在堆栈中,所以访问速度更快

创建元组的语法如下:

  1. // 无类型声明
  2. let variable_name = (element1, element2, ..., element3);
  3. // 有类型声明
  4. let variable_name: (data_type, ..., data_type) = (element1, element2, ..., element3);

元组的元素写在圆括号中。要访问元素,使用点运算符,后跟该元素的索引。

  1. fn main() {
  2. let a = (38, 923.329, true);
  3. let b: (char, i32, f64, bool) = ('r', 43, 3.14, false);
  4. println!("a.0: {}, a.1: {}, a.2: {}", a.0, a.1, a.2);
  5. println!("b.0: {}, b.1: {}, b.2: {}, b.3: {}", b.0, b.1, b.2, b.3);
  6. // 元组解构
  7. let pixel = (50, 0, 200);
  8. let (red, green, blue) = pixel;
  9. println!("red: {}, green: {}, blue: {}", red, green, blue);
  10. }

在上面的代码中,我在第 2 行和第 3 行声明了两个元组。它们只包含我当时想到的随机值。但是仔细看,两个元组中每个元素的数据类型都不同。然后,在第 5 行和第 6 行,我打印了两个元组的每个元素。

在第 9 行,我声明了一个名为 pixel 的元组,它有 3 个元素。每个元素都是组成像素的颜色红色、绿色和蓝色的亮度值。这个范围是从 0 到 255。所以,理想情况下,我会声明类型为 (u8, u8, u8),但是在学习代码时不需要这样优化 ; )

然后,在第 10 行,我“解构”了 pixel 元组的每个值,并将其存储在单独的变量 redgreen 和 blue 中。然后,我打印了 redgreen 和 blue 变量的值,而不是 pixel 元组的值。

让我们看看输出……

  1. a.0: 38, a.1: 923.329, a.2: true
  2. b.0: r, b.1: 43, b.2: 3.14, b.3: false
  3. red: 50, green: 0, blue: 200

看起来不错 : )

额外内容:切片

准确的来说,切片(Slice) 不是 Rust 中的复合数据类型。相反,切片是现有复合数据类型的 “切片”。

一个切片由三个元素组成:

◈ 一个初始索引
◈ 切片运算符(.. 或 ..=
◈ 一个结束索引

接下来是数组切片的一个示例:

  1. fn main() {
  2. let my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  3. let my_slice = &my_array[0..4];
  4. for element in my_slice {
  5. println!("{element}");
  6. }
  7. }

就像 C 和 C++ 一样,& 用于存储变量的引用(而不是原始指针)。所以 &my_array 意味着对变量 my_array 的引用。

然后,来看看切片。切片由 [0..4] 表示。这里,0 是切片开始的索引。而 4 是切片结束的索引。这里的 4 是一个非包含索引。

这是程序输出,以更好地理解正在发生的事情:

  1. 0
  2. 1
  3. 2
  4. 3

如果你想要一个 包含 范围,你可以使用 ..= 作为包含范围的切片运算符。

  1. fn main() {
  2. let my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  3. let my_slice = &my_array[0..=4];
  4. for element in my_slice {
  5. println!("{element}");
  6. }
  7. }

现在,这个范围是从第 0 个元素到第 4 个元素,下面是输出来证明这一点:

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4

总结

本文讲到了 Rust 编程语言中的复合数据类型。你学习了如何声明和访问存储在数组和元组类型中的值。此外,你还了解了切片“类型”,以及如何解构元组。

在下一章中,你将学习如何在 Rust 程序中使用函数。敬请关注。

(题图:MJ/22a0d143-2216-439f-8e1d-abd94cdfdbd0)


via: https://itsfoss.com/rust-arrays-tuples/

作者:Pratham Patel 选题:lkxed 译者:Cubik65536 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者 :Qian Qian \"Cubik\"
🌟🌟
翻译: 17.0 篇
|
贡献: 228 天
2022-10-04
2023-05-20
https://linux.cn/lctt/Cubik65536
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
我和聊天机器人(AI)对话Bash 基础知识系列 #1:创建并运行你的第一个 Bash Shell 脚本 | Linux 中国Linux 中的模糊文件搜索 | Linux 中国Rust 基础系列 #3: Rust 中的数据类型 | Linux 中国为什么程序员喜欢为 Linux 打包 | Linux 中国7 个超轻量级 Linux 发行版 | Linux 中国贼喊捉贼式的新疆指控,让人出离愤怒Rust 基础系列 #5: Rust 中的函数 | Linux 中国如何在 Linux 系统中使用 Ventoy 创建多重引导的 U 盘 | Linux 中国TUXEDO Stellaris 16(Gen5)是目前所能找到的终极 Linux 笔记本电脑 | Linux 中国如何在 Rocky Linux 9 / AlmaLinux 9 上安装 KVM | Linux 中国risiOS:一个易于使用的基于 Fedora 的 Linux 发行版 | Linux 中国Rust 基础系列 #6: 条件语句 | Linux 中国如何在 Linux 主机和 KVM 中的 Windows 客户机之间共享文件夹 | Linux 中国8 款最佳的 Linux 远程桌面工具 | Linux 中国终端基础:在 Linux 中删除文件和文件夹 | Linux 中国Arch Linux 的最佳 GUI 包管理器 | Linux 中国Rust 基础系列 #2: 在 Rust 程序中使用变量和常量 | Linux 中国又见桐花开如何在 Linux 中合并 PDF 文件 | Linux 中国冷却的不止季节(41)— 丧葬费Bash 基础知识系列 #5:在 Bash 中使用数组 | Linux 中国Rust 基础系列 #8:编写里程碑 Rust 程序 | Linux 中国使用 ChatGPT AI 从英文文本生成 Linux 命令 | Linux 中国Bash 基础知识系列 #3:传递参数和接受用户输入 | Linux 中国blendOS 的目标:取代所有的 Linux 发行版 | Linux 中国如何入门 Linux Shell 脚本编写 | Linux 中国大家最喜欢的 Linux 终端字体 | Linux 中国Voyager Linux 23.04:具有华丽外观且无 Snap 的 Ubuntu 体验 | Linux 中国Alpine Linux 3.18 发布 | Linux 中国Rust 基础系列 #7: 在 Rust 中使用循环 | Linux 中国Agustín Hernández:中美洲建筑背景下的未来主义巨构在 Linux 上用 Kdenlive 编辑视频 | Linux 中国遥思龙泉桃花宴Rust 基础系列 #1: 创建并运行你的首个 Rust 程序 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。