【第二课】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…

Redis知识点整理 - 脑图

自己整理的"Redis脑图"是一份详细的知识图谱,涵盖了Redis的核心内容,包括数据类型、基本操作、高级特性和优化技巧等。适用于Redis初学者和有经验的开发者,帮助系统地学习和回顾Redis的相关知识。通过这份脑图,可以对Re…

Windows配置域名映射IP

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

Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu

Ubuntu20.04 解决一段时间后键盘卡死的问题 在Ubuntu 20.04中为脚本文件(如 .sh 文件)创建桌面快捷方式,可以通过编辑 .desktop 文件来实现。这种快捷方式可以提供一种方便的方法来执行脚本,如重启 IBus 服务,这对于解…

第 20 章 - Golang 网络编程

下面将详细介绍Go语言中的网络编程,包括TCP编程、UDP编程和HTTP服务器的创建。为了更好地理解这些概念,我将提供一些简单的示例代码来说明每个部分。 1. TCP 编程 TCP(传输控制协议)是一种面向连接的协议,它确保数据…

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…

HTTP 安全头配置:如何配置 HTTP 安全头来保护应用

文章目录 前言一、常用的 HTTP 安全头1.1 Strict-Transport-Security (HSTS)1.2 Content-Security-Policy (CSP)1.3 X-Frame-Options (XFO)1.4 X-Content-Type-Options1.5 X-XSS-Protection1.6 Referrer-Policy1.7 Feature-Policy 二、实践案例2.1 项目结构2.2 客户端代码2.3 服…

爬虫优化策略优化请求逻辑

在网络爬虫和数据抓取过程中,优化请求逻辑是一项核心任务。合理的优化不仅可以提升抓取效率,还能有效降低目标服务器的负载,避免触发反爬机制。 本文将围绕优化请求逻辑的核心策略展开,帮助学习者掌握减少不必要的请求、批量抓取以及调整抓取策略的技术要点。目标是通过理…

树莓派镜像 DIY 制作

安装交叉编译环境 需要一个 Ubunut18.04 的64位的主机 或者直接在树莓派系统上进行编译; apt-get update apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip获取树莓派内核源码 # 下载成功后,在当前目录下有一个 linux 的文件夹 g…

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

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

【DQ Robotics】基于SVD的全秩矩阵逆

基于SVD的全秩矩阵逆 英文原文: As you might remember from your undergraduate-level courses, every real matrix can be decomposed in its singular-value decomposition (SVD) as follows A U Σ V T A U \Sigma V^T AUΣVT where U ∈ R m m U \in \mat…

【经验分享】2024年11月下半年软件设计师考试选择题估分(持续更新~~)

【经验分享】2024年11月下半年软件设计师考试选择题估分(持续更新~~) 1、可以使用ping命令测试网络连通性✓ 2、属于TCP/IP的应用层协议的是DNS✓ 3、访问Web服务器默认的端口号是80✓ 4、宏病毒可以通过邮件自带的Word文档附件感染主机。✓ 5、甲公司发…

Java多线程编程详解

在当今的计算环境中,多线程编程已经成为提高应用程序性能和响应速度的重要手段。Java作为一种广泛使用的编程语言,其内置的多线程支持使得开发者能够轻松实现并发执行的任务。本文将深入探讨Java多线程的基本概念、优势、核心概念以及实际应用中的注意事…

RDD触发算子:一些常用的触发算子(count、foreach、saveAsTextFile、first)

文章目录 1、count算子功能语法 2、foreach算子功能语法 3、saveAsTextFile算子功能语法 4、first算子功能语法举例 1、count算子 功能 统计RDD集合中元素的个数,返回一个int值 语法 def count(self) -> int2、foreach算子 功能 对RDD中每个元素调用一次参数中…

Shell脚本6 -- 条件判断if

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

ks 小程序sig3

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

kubernetes如何配置默认存储

如果不想每次都创建PV,希望k8s集群中能够配置号默认存储,然后根据你的PVC自动创建PV,就需要安装一个默认存储,也就是storageclass 什么是storageclass Kubernetes提供了一套可以自动创建PV的机制,即:Dyna…

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

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