【第二课】Rust变量与数据类型(一)

目录

前言

变量绑定

变量遮蔽

常量

基本数据类型

复合数据类型

(1)元组类型

(2)数组类型

(3)结构体类型

(4)枚举类型

总结


前言

上一课是rust的入门第一课,介绍了rust的安装和cargo新建rust项目,这节课我们来了解一下rust的变量和数据类型,rust的变量和其他编程语言略有不同,我们在这一节细说。

在开始介绍之前,我们使用cargo创建项目来编写本节课的代码

cargo init lesson2

使用vscode打开

变量绑定

rust中的变量分为可变和不可变,其他的编程语言中也有这样的概念,比如scala中使用val定义不可变变量,var定义可变变量。不可变变量的含义是第一次赋值后,无法第二次赋值,可变变量则没有这样的限制。

这里需要注意和其他编程语言的变量赋值,变量初始化不同,在rust中这样的行为称为变量绑定,即将变量名称和值绑定在一起,这样做的原因和后面要介绍的所有权机制有很大关系,rust中的所有权是一个很有意思的东西,这里简单说一句:每一块内存都只有一个主人,当主人不在了,这块内存也要交还。想一想垃圾回收是不是也在做这样一件事情,java中jvm不断的寻找没有使用的内存,然后回收这一块内存,rust中的所有权机制使用另一种思路在解决垃圾回收的问题。

fn main() {let x = 8;x = 18;let y: i32 = 18;
}

rust中使用let定义不可变变量,变量名后可以跟数据类型,也可以不跟,编译器会自动推断数据类型,对于不可变变量,进行二次绑定值时会报错,我们使用cargo build编译一下看看报错,可以看到rust的编译器解释的非常详细,第一次将8绑定给变量x,不能把18第二次绑定给x,甚至告诉我们使用mut修饰就解决问题了,不得不感叹rust编译器的强大。

 --> src/main.rs:3:5|
2 |     let x = 8;|         - first assignment to `x`
3 |     x = 18;|     ^^^^^^ cannot assign twice to immutable variable|
help: consider making this binding mutable|
2 |     let mut x = 8;|         +++
fn main() {let mut x = 8;x = 18;
}

rust中使用mut修饰可变变量,可以在绑定值后,再次修改变量,重新绑定一个新值,不过要注意,重新绑定的值必须和变量的数据类型一致,即x是i32类型,第二次绑定值,不可以绑定true/false这样的bool值。

变量遮蔽

变量遮蔽是rust中一个不同于其他语言的概念,指的是在同一个作用域中可以再次声明一个之前已经声明过的变量名,新的变量名会遮蔽之前的变量名,之前的变量名不见了,对于第一次学习rust的同学来说很难理解,因为这是其他编程语言中没有的,我们使用代码来解释一下,继续坚持看下去。

fn main() {// 定义不可变量x,给x绑定上内存中的值8let x = 8;// 定义不可变量x,给x绑定上内存中的值truelet x = true;
}

上面代码中,我们使用let定义了2个同名的变量,注意这里不是修改变量的值哦,而是定义了2个不同的变量,其中第一个变量x被第二个变量x遮蔽了,所以既然是不同的变量,数据类型也就可以不一样了,因为这里是2块不同的内存,和之前可变变量的二次绑定不一样,之前的例子中x对应的内存里第一次存的是8,后来存的是18,而变量遮蔽中x对应的内存中第一个存的是8,后面新定义了变量x,对应的是一个新的内存,该内存存的是true,之前8所在的内存还存在,并没有被修改。只是我们使用了相同的变量名称,绑定了一块新的内存空间。那么变量遮蔽的作用是什么呢?显而易见的,可以在不改变变量名的情况下,转换数据类型以及可变性。这也是rust安全性的体现,如果想某个变量的值不再被访问,那就重新定义一个同名的变量吧。

常量

和大部分编程语言的常量一样,rust中常量使用const声明,并且数据类型不能省略,必须显式指出。

fn main() {const PI: f64 = 3.14;
}

基本数据类型

有编程语言基础的,这一小节可以快速浏览,用的时候不断巩固即可

(1)整型

(2)浮点型

(3)布尔型

(4)字符类型

(5)区间类型

范围类型我们说一说,区间类型通常表示为一个表达式,比如(1..5)表示左闭右开的区间[1,5),(1..=5)表示左闭右闭的区间[1,5],这种在循环中,或者初始化一段区间特别方便,这种在别的编程语言也有体现,比如在scala中使用 1 until 5表示左闭右开的区间,使用1 to 5表示左闭右闭的区间,在scala中,这称之为Range。其他的基本类型大家自行了解,简单看看就行,多写写代码熟悉熟悉就好。

复合数据类型

(1)元组类型

元组,tuple,在大部分语言中都有,长度固定,类型可以不同,元组的类型使用(i32, bool)表示,括号中的类型,表示元组中具体数据的类型。因为长度固定,所以不能增删,只能改查,查询使用索引,从0开始。元组是一个非常灵活好用的数据类型,但是java8没有,遇到这种情况就只能定义一个新的类。

fn main() {let mut t1: (i32, f64, bool) = (1, 2.0, true);// 查println!("t1.0 = {}", t1.0);// 改t1.0 = 18;// 定义只有一个元素的元组let t2 = (3,);
}

(2)数组类型

数组,array,在大部分语言中都有,长度固定,类型相同,数组的类型使用[i32;5]表示,分号前表示数组中元素的类型,分号后表示数组的大小。

fn main() {let mut a1: [i32; 4] = [1, 2, 3, 4];// 改a1[0] = 5;// 查println!("a1[0]={}", a1[0]);// 数组的另外一种初始化方式let a2 = [1; 5]; // [1,1,1,1,1]
}

(3)结构体类型

结构体,struct,在java/scala这样面向对象的语言中,一般用类表示,但是类和结构题还是有区别的。结构体的定义和初始化都比较简单,关于结构体的方法的使用和更高阶的用法,我们放在面向对象去讲解,这里只占一个坑,结构体也是rust中的一种数据类型。

关于元组结构体我们也放到后面详述。

fn main() {let s1 = Student {name: "www".to_string(),age: 23,};
}// 定义
struct Student {name: String,age: i8,
}

(4)枚举类型

rust中的枚举非常强大,语法和java等语言中枚举定义类似。下面代码定义了2个枚举类型,一个带参数,一个不带参数。rust中的枚举通常搭配模式匹配使用,关于模式匹配,我们在后面统一讲解,这是一个非常强大的功能,和scala中的模式匹配一样,一旦用上了就爱不释手。

fn main() {let a1 = LEVEL::A(1, "1".to_string());let a2 = LEVEL::A(2, "2".to_string());
}// 定义
enum LEVEL {A(i32, String),B(i32, String),
}enum COLOR {RED,BLUE,
}

总结

本节介绍了rust中的变量和数据类型,需要重点理解有变量绑定,变量遮蔽这两个概念,其他的数据类型和复合数据类型简单过一遍即可,不需要强制记住,这些都是基本语法,结合多年编程的经验来看,基本语法多写写才能巩固,靠看一遍就记住是很难得,语言只是工具,像变量绑定,变量遮蔽代表的是rust设计者的思想,很值得借鉴学习,下一节会详细介绍rust中的容器类型,集合,映射等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Exadata: 将数据库硬件和软件设计在一起

Engineering Database Hardware and Software Together,是Juan Loaiza在2015 VLDB大会上的Keynotes。虽然是10年前的文章,但其中一些要点一直延续至今,并未改变。 本文将讲解Keynotes摘要和演讲中的要点。 摘要 其中的一些观点&#xff1a…

Windows配置域名映射IP

一、找到 hosts 文件 打开 C:\Windows\System32\drivers\etc 二、添加hosts文件修改、写入权限 右击hosts文件,点击属性 -> 安全 -> Users -> 编辑 -> Users -> 添加修改、写入权限 -> 确定 -> 确定 进入常规,将只读属性关闭 三、…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterato…

XXL JOB DockerCompose部署

官网给的方式是 Docker 命令启动,但是用起来太麻烦了,所以用DockerCompose 简化部署 创建数据库,导入 SQL SQL 脚本位置为/xxl-job/doc/db/tables_xxl_job.sql https://raw.githubusercontent.com/xuxueli/xxl-job/refs/heads/master/doc/…

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版,外加输入法、IDEA等,我想将这个虚拟机里的系统直接搬到物理机中,那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了,那直接说干就干。 本教程基于Ubuntu24.0…

YOLO系列番外——数据偏移与分布不均对模型的影响分析与炫酷的动态分布图代码分享

背景 在深度学习的应用中,数据质量对模型的性能至关重要。随着智能化应用场景的扩展,数据的复杂性不断增加,如何处理数据偏移(Data Shift)和数据分布不均(Data Imbalance)成为了模型训练和部署过…

Shell脚本6 -- 条件判断if

声明: 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c…

ks 小程序sig3

前言 搞了app版的快手之后 (被风控麻了) 于是试下vx小程序版的 抓包调试 小程序抓包问题 网上很多教程, github也有开源的工具代码 自行搜索 因为我们需要调试代码,所以就用了下开源的工具 (可以用chrome的F12功能&a…

hive 统计各项目下排名前5的问题种类

实现指定某项目下的数据效果图如下所示: 其中 ABCDE 为前5名的问题种类,其中A问题有124个(出现了124次) 数据说明: 整个数据集 包含很多项目一个项目 包含很多问题一个问题 选项 可认为是 类别值,所有出…

如何解决将长视频转换为易于处理的 Spacetime Patch 的问题?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 将长视频转换为易于处理的 Spacetime Patch(时空补丁)是一项挑战,尤其是当视频内容复杂或包含长时间连续场景时。在计算机视觉和视频分析等领域,Spacetim…

[ACTF2020]Upload 1--详细解析

信息收集 题目告诉我们是一道upload,也就是文件上传漏洞题目。 进入界面,是一个灯泡,将鼠标放在图标上就会出现文件上传的相应位置: 思路 文件上传漏洞,先看看有没有前端校验。 在js源码中找到了前端校验&#xff…

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项(曼哈顿距离) 2.3.2…

可认证数据资产合约标准协议(CMIDA-1)意见征集

标准背景 数据资产具备多维度的属性,涵盖行业特性、状态信息、资产类型、存储格式等。数据资产在不同流通主体之间可理解、可流通、可追溯、可信任的重要前提之一是存在统一的标准,缺失统一的标准,数据混乱冲突、一数多源、多样多类等问题将…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中,我们通常会将某些常见组件进行二次封装,以便更好地实现特定的业务需求。然而,在封装 Table 组件时,遇到一个问题:Table 内部暴露的方法,在封装之后的组件获取不到。 代码展示为: …

Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍

文章目录 1. Dolby TrueHD特点总结 2. Dolby Digital Plus (E-AC-3)特点总结 Dolby TrueHD 与 Dolby Digital Plus (E-AC-3) 的对比 Dolby TrueHD和Dolby Digital Plus (E-AC-3) 是两种高级的杜比音频编码格式,常用于蓝光影碟、流媒体、影院等高品质音频传输场景。它…

Python Pillow图像编辑

Pillow简介 Pillow 不仅是 PIL 库的“复制版”,而且它又在 PIL 库的基础上增加了许多新的特性。Pillow 发展至今,已经成为了比 PIL 更具活力的图像处理库。 Pillow 的初衷只是想作为 PIL 库的分支和补充,如今它已是“青出于蓝而胜于蓝”。 …

1+X应急响应(网络)系统信息收集分析:

系统信息收集分析: 系统启动项和计划任务分析: 系统进程,服务分析: 内存取证: 系统崩溃转储:

找不到vcruntime140.dll怎么办,彻底解决vcruntime140.dll丢失的5种方法

当计算机系统中无法找到vcruntime140.dll这个特定的动态链接库文件时,可能会引发一系列运行问题,具体表现形式多样且影响范围较广。对于依赖于该文件运行的各类软件应用来说,缺失vcruntime140.dll将直接导致程序无法正常启动或执行&#xff0…

Redis学习 ——缓存

文章目录 一、Redis缓存的介绍二、Redis缓存问题2.1 缓存穿透2.2 缓存击穿2.3 缓存雪崩2.4 双写一致性2.5 缓存持久化RDBAOF 三、缓存数据管理3.1 数据过期策略3.2 数据淘汰策略 一、Redis缓存的介绍 我们在日常的代码编写中比较少使用到Redis,但是如果涉及到了比较…

“乐鑫组件注册表”简介

当启动一个新的开发项目时,开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间,还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念,旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…