前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >rust数组和元组

rust数组和元组

作者头像
zy010101
发布于 2023-01-09 07:46:42
发布于 2023-01-09 07:46:42
82500
代码可运行
举报
文章被收录于专栏:程序员程序员
运行总次数:0
代码可运行

rust基本数据类型——复合类型

复合类型(Compound types)可以将多个值组合成一个类型。Rust 有两个原生的复合类型:元组(tuple)和数组(array)。

元组类型

元组是一个将多个其他类型的值组合进一个复合类型的主要方式。元组长度固定:一旦声明,其长度不会增大或缩小。

我们使用包含在圆括号中的逗号分隔的值列表来创建一个元组。元组中的每一个位置都有一个类型,而且这些不同值的类型也不必是相同的。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
}

变量 tup 被绑定了一个元组值 (500, 6.4, 1),该元组的类型是 (i32, f64, u8),也就是在rust中元组是由圆括号将多个类型组合在一起。rust的元组和python的元组非常类似,但是rust的元组必须由()包括起来,而python中并不需要。并且rust的元组也拥有元组解构的语法。下面是一个元组结构的例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main() {
    // 元组变量tup
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    // 在rust中可以使用模式匹配(pattern matching)来解构元组。
    let (x, y, z) = tup;

    println!("{x}");
    println!("{y}");
    println!("{z}");

}

在rust中也可以直接使用.+下标的方式来访问元组中的元素。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
    println!("{}", tup.0);
    println!("{}", tup.1);
    println!("{}", tup.2);
}

注意,元组的下标是从0开始的。

单元类型

在rust中,我们称空元组为“单元类型”,这种类型在声明的时候类型为(),并且它只有唯一的值,也是()。单元类型占据的内存大小为0. 如果一个表达式不返回任何其他值,那么会隐式返回单元类型。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main() {
    let _t: () = ();
}

这里声明了_t的类型是(),并赋予它值()。

单元类型是非常有必要的,因为在rust里没有返回值的函数是“发散函数”,它们有单独的定义。而像main函数这样的,是有返回值的,main会隐式返回().

再比如,你可以用 () 作为 map 的值,表示我们不关注具体的值,只关注 key。 这种用法和 Go 语言的 struct{} 类似,可以作为一个值用来占位,但是完全不占用任何内存。

数组

大多数编程语言中都有数组,在rust中数组中的每个元素的类型必须相同,并且数组的长度是固定的。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 数组类型
let a = [1, 2, 3, 4, 5];
for i in a{
    println!("{i}");
}

当需要进行声明类型的时候,可以像下面这样做。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let a: [i32; 5] = [1, 2, 3, 4, 5];      // [i32; 5]表示数组的大小是5,元素的类型是i32.

此外,你还可以通过在方括号中指定初始值加分号再加元素个数的方式来创建一个每个元素都为相同值的数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let a: [3; 5]

变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。

访问数组元素,是使用数组名[下标]的方式,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let a:[i32; 5] = [3; 5];    // 数组中5个元素都是i32类型的3
println!("{}", a[0]);

数组越界访问

程序在索引操作中使用一个无效的值时导致 运行时 错误。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use std::io;

fn main() {
    let a = [1, 2, 3, 4, 5];

    println!("Please enter an array index.");

    let mut index = String::new();

    io::stdin()
        .read_line(&mut index)
        .expect("Failed to read line");

    let index: usize = index
        .trim()
        .parse()
        .expect("Index entered was not a number");

    let element = a[index];

    println!("The value of the element at index {index} is: {element}");
}

此代码编译成功。如果您使用 cargo run 运行此代码并输入 0、1、2、3 或 4,程序将在数组中的索引处打印出相应的值。如果你输入一个超过数组末端的数字,如 10,你会看到类型下面这样的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Please enter an array index.
10
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:48:19
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

程序在索引操作中使用一个无效的值时导致 运行时 错误。程序带着错误信息退出,并且没有执行最后的 println! 语句。当尝试用索引访问一个元素时,Rust 会检查指定的索引是否小于数组的长度。如果索引超出了数组长度,Rust 会 panic,这是 Rust 术语,它用于程序因为错误而退出的情况。这种检查必须在运行时进行,特别是在这种情况下,因为编译器不可能知道用户在以后运行代码时将输入什么值。

除非是下面这种,在编译时就可以被检测到的越界行为,能够在编译期直接指出错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let a: [i32, 5] = [1,2,3,4,5];
println!("{}", a[10]);  // 编译期即可发现该错误。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust学习笔记之基础概念
今天,我们继续「Rust学习笔记」的探索。我们来谈谈关于「基础概念」的相关知识点。
前端柒八九
2023/03/23
7300
Rust学习笔记之基础概念
【Rust学习】03_常用编程概念
本章介绍了几乎所有编程语言中出现的概念以及它们在 Rust 中的工作方式。许多编程语言的核心有很多共同点。本章中介绍的概念都不是 Rust 独有的,但我们将在 Rust 的背景中讨论它们,并解释使用这些概念的约定。
思索
2024/07/12
2350
【Rust学习】03_常用编程概念
Rust入坑指南:常规套路
学习一门语言第一个要了解的当然就是变量啦。Rust使用关键字let来定义变量。我们写一个简单的demo
Jackeyzhe
2020/03/11
7260
Rust入坑指南:常规套路
Rust基本数据类型
在 Rust 中,每个值都属于某一个数据类型,用来告诉 Rust 它被指定为何种数据,以便明确数据处理方式。Rust 基本数据类型主要有两类子集:标量(scalar)和复合(compound)。
hotarugali
2022/03/18
1.1K0
Rust 基础语法(一) -- 变量、运算与注释
上一篇文章中我们已经用 Rust 运行了 Hello World 程序,那么,接下来我们就来学习一下 Rust 的基础语法。
用户3147702
2022/06/27
5060
Rust 基础语法(一) -- 变量、运算与注释
Rust学习笔记(3)- 变量和可变属性
就会直接报错,会提示不能第二次给不可变的变量赋值(cannot assign twice to immutable variable)。 除非写成这样:
TestOps
2022/04/07
4940
Rust学习笔记(3)- 变量和可变属性
Rust基础语法(变量、常量、数据类型)
变量默认是不可改变的(immutable),这是Rust 提供的安全性和简单并发性来编写代码的众多方式之一。 let 关键字用于定义变量,默认定义的是不可变变量:
共饮一杯无
2022/11/28
6810
一网打尽 Rust 语法
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/04/30
1680
一网打尽 Rust 语法
Rust 从入门到精通05-数据类型
Rust 是 静态类型(statically typed)语言,也就是说在编译时就必须知道所有变量的类型。
IT可乐
2022/09/22
9420
Rust 从入门到精通05-数据类型
Rust基本数据类型
什么是类型?类型是对二进制数据的一种约束行为。类型比起直接使用二进制数据,有许多优势:
端碗吹水
2022/06/01
9370
Rust基本数据类型
Rust学习入门
高性能,内存利用率高,没有运行时和垃圾回收 可靠 , 丰富的类型系统和所有权模型保证内存和线程安全,编译器可以消除各种错误 生产力, 包管理器、构建工具一流, 多编辑器支持自动补齐和格式化代码
awwewwbbb
2022/10/05
3650
【Rust 易学教程】第 1 天:Rust 基础,基本语法
今天,我们正式进入 Rust 基础的学习。在本文的内容中,我会为大家介绍以下内容:
前端修罗场
2023/11/12
4720
Rust修仙笔记之筑基期
如果我想让一个申明的变量可变,只需用mut修饰即可,注意我们右侧的变量用双引号,不能用单引号。
Maic
2024/02/29
1090
Rust修仙笔记之筑基期
rust基本数据类型——标量类型
在rust里数据类型可以分为标量(scalar)和复合(compound)类型,标量类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。rust是静态强类型语言,它在编译时就需要知道所有变量的类型,并且不同类型的数据之间是不允许进行运算的。
zy010101
2022/12/20
1.1K0
编程语言新宠 Rust 不完全入门指南
学习 Rust 之前,在知乎等平台也看到过一些回答,认为 Rust 学习曲线陡峭、难学,个人觉得如果有些 C/C++ 的基础其实学起来也还好,只不过 Rust 有很多独有的概念,这一点是和现有很多主流语言是不同的,需要花点时间看下。
五月君
2021/03/16
2.8K0
编程语言新宠 Rust 不完全入门指南
Rust - 安装环境、基本类型、流程控制、函数、模块、泛型、所有权
学习Rust语言是公司同事最先开始提议的,准备用接下来的项目试试水,Rust是一个强类型编译型语言,比较偏向底层,所以开启了Rust的探索之旅。
stark张宇
2023/02/24
1.2K0
【Rust】001-基础语法:变量声明及数据类型
Rust 入门与实践:https://juejin.cn/book/7269676791348854839?utm_source=course_list
訾博ZiBo
2025/01/06
730
【Rust】001-基础语法:变量声明及数据类型
Rust基础知识
随着 Rust 语言的大火,前端圈里掀起了一股 Rust 风 —— 一切能用 Rust 实现的都在尝试使用 Rust 重写,比如最近很火的对标 Babel 的 JavaScript/TypeScript 编译器 swc,相信很多人都已经尝试过了。 对于我们前端来说,这么火的语言,当然不能放过了,必须跟上时代的潮流。 一、什么是 Rust Rust 是由 Mozilla 主导开发的通用、编译型编程语言。设计准则为 “安全、并发、实用”,支持函数式、并发式、过程式以及面向对象的程序设计风格。     —— 维
用户1097444
2022/06/29
8130
Rust基础知识
【Rust 基础篇】Rust数据类型详解
Rust是一种现代的、安全的系统编程语言,注重内存安全和并发性。在Rust中,数据类型是程序中最基本的构建块之一。本篇博客将详细解释Rust的各种数据类型,并提供相关代码示例。
繁依Fanyi
2023/10/12
5960
【Rust】005-Rust 结构体
在Rust中,元组结构体是一种特殊的结构体形式,它结合了元组和结构体的特性。元组结构体类似于普通的结构体,但它没有字段名称,只有字段类型。这种结构体更像是带标签的元组,通常用于需要对某些数据进行简单封装而不需要命名每个字段的场景。
訾博ZiBo
2025/01/06
1240
相关推荐
Rust学习笔记之基础概念
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验