Rust之抽空学习系列(三)—— 编程通用概念(中)

Rust之抽空学习系列(三)—— 编程通用概念(中)

1、变量&可变性

在Rust中,变量默认是不可变的

fn main() {let x = 5;println!("x is {}", x);
}

使用let来声明一个变量,此时变量默认是不可变的,因此x的值是5,如果修改就会发生报错
在这里插入图片描述
想要再次将x赋值为6时,编译报错了,提示无法对不可变的变量x两次赋值,并且还贴心地标注了两次赋值发生的位置,也给出了修改建议,让我们考虑使用mut来绑定变量x

这个不可变变量的感觉就像是Java中的final修饰的变量或者是Kotlin中val声明的变量,仅仅是赋值一次,而后不可修改

而将变量声明为可变,就要用到刚刚建议里提及的mut关键字了

fn main() {let mut x = 5;  // 声明为可变x = 6;println!("x is {}", x);
}

此时代码正常运行,输出6,可变的需要开发者自己来添加,这无形中也是倒逼开发者去思考设置可变的用途和必要性

在Rust中不可变的行为是默认的,而可变的行为需要开发者自己指定,这也是安全性的体现

2、常量

在Rust中,常量是使用const关键字来进行声明的

但是,在进行常量声明的时候,有一些需要注意的内容:

  • 不可以使用mut
  • 必须标注类型
  • 可在任意作用域内声明
  • 仅可以使用常量表达式赋值

不能使用mut很好理解了,本身常量和变量就是矛盾的嘛
使用常量表达式进行赋值的原因是由于它们能够在编译时被计算出来

fn main() {const MAX_POINTS: u32 = 100000;   // 指明类型const ONE_HOUR: u32 = 60 * 60;   // 常量表达式println!("The maximum number of points is {}", MAX_POINTS);
}
const MY_NAME: &str = "John";  // 任何作用域

3、变量遮蔽

变量遮蔽指的是新声明的变量覆盖了旧的同名变量

fn main() {let x = 5;let x = x + 1;   // 6let x = x * 2;   // 12println!("The value of x is: {}", x);
}

使用变量遮蔽与将变量声明为mut是不同的,使用变量遮蔽声明的新变量依旧是不可变的,只不过相当于是用来保存新的数据了;除此以外,变量遮蔽甚至还可以修改变量的类型(请牢记,这是新的变量)

那么,此时我就想到一个场景,很适合使用这个特性
比方说,在实际业务当中,后端接口返回了一个时间戳表示的长串数字,前端需要以yyyy-MM-dd这样的格式展示,这样的话,通常我们是这样处理的:

fn main() {let date = 1677386710000; // 可能是精确到毫秒的let formatedDate = get_formated_date_str(date, "yyyy-MM-dd");println!("formatedDate: {}", formatedDate);
}

此时,我们产生了一个中间变量date,但是它仅仅在这里用于转换,我们真正要显示的其实是formatedDate,那么我们可以借助变量遮蔽稍微修改下:

fn main() {let date = 1677386710000; // 1.0版本 原材料let date = get_formated_date_str(date); // 2.0版本 加工上市的成品println!("formatedDate: {}", formatedDate);
}

使用变量遮蔽就可以将同一个或一类的内容的加工作为多个版本,最后用到的那一版作为结果

帮忙省去了那些命名费解、存在又很尴尬的临时量,使得代码的业务逻辑主线更加清晰

4、数据类型

4.1、标量类型

标量类型作为单个值类型的统称
Rust内部定义了4种基础的标量类型

  • 整数
  • 浮点数
  • 布尔值
  • 字符
4.1.1、整数类型

整数类型表示的就是不包含小数部分的整数,其中分为有符号无符号

无符号数始终不为负,开头使用u区别,比如u32
有符号数通过二进制补码的形式来存储

以下是关于各个类型的整数类型所能够表示的范围:
在这里插入图片描述
除了直接指明描述位数的类型,像i32u32,还有isizeusize两种特殊的类型,它们的长度取决于程序运行的目标平台

字面量

整数的字面量可以有多种形式呈现:
在这里插入图片描述

整数溢出

整数溢出主要是由于存储的数超出类型的限制,就像往桶里倒水一样

debug模式下,发生整数溢出会抛出panic

let big: u8 = 255;
let small = 3;
let result = small + big;   // 会发生溢出
print!("结果={}", result)

在这里插入图片描述
很明显255已经是u8的极限了
程序发现这个算术运算有溢出的风险,立马抛出错误,中止执行

4.1.2、浮点类型

Rust提供了两种基础的浮点数类型:f32f64

在Rust中,浮点类型默认会被推导为f64类型,因其在现代CPU执行中相较于f32有更高精度,执行效率也相差无几
在这里插入图片描述
使用f32需要显式进行指定

Rust中的f32f64对应的就是IEEE-754标准中的单精度浮点数双精度浮点数

4.1.3、布尔类型

布尔类型与其他语言是一样的,也是true和false两个值,并且仅占据一个字节

在条件表达式等控制语句中会有大量的出场

4.1.4、字符类型

字符类型用以描述单个字符
在这里插入图片描述
char类型占4个字节的空间,并且是一个Unicode标量值

4.2、复合类型

在Rust当中,复合类型表示将不同的类型组合为一个类型

在Rust当中,提供了两种基础的复合类型:

  • 元组(tuple)
  • 数组(array)
4.2.1、元组类型

元组能够将多个不同类型的值组合进一个类型,但是一旦声明结束便不可修改元素的数量

let tup: (i32, char, bool) = (15, 'A', false);   // 声明

如果需要对于其中的元素进行访问,可以使用解构的方式

let (a, b, c) = tup;    // 几个变量将和里面的元素对应上  比如:a: 15, b: 'A', c: false

除了解构的方式,元组还可以支持使用.配合索引的方式对元组内部的元素进行访问

let tup: (i32, char, bool) = (15, 'A', false);
print!("{}", tup.1);   // 下标从0开始
4.2.2、数组类型

数组有固定的长度,而且数组中的各个元素必须为相同的类型

let list: [char; 3] = ['A', 'B', 'C'];     // 前面是类型,后面是长度
let zeros = [0; 5];   // 长度为5,都是0

数组的声明可以使用[]根据类型长度初始化,也可以指定默认值和长度

数组的访问和其他语言也几乎没有什么不同

print!("元素2={}", zeros[1]);

数组对应的是内存栈中一块连续的内存

另外,提到数组,就不得不说一个名为数组越界的问题

fn main() {let zeros = [0; 5];print!("元素9={}", zeros[8]);   // 必定越界
}

在这里插入图片描述
将索引修改为一个没有的量(无法访问到),这样,在程序执行的过程中会抛出panic,进而中止了程序的运行

https://kaisery.github.io/trpl-zh-cn/ch03-01-variables-and-mutability.html
 
https://www.bilibili.com/video/BV1182ZYhEdV

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

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

相关文章

Mybatis---事务

目录 引入 一、事务存在的意义 1.事务是什么? 2.Mybatis关于事务的管理 程序员自己控制处理的提交和回滚 引入 一、事务存在的意义 1.事务是什么? 多个操作同时进行,那么同时成功,那么同时失败。这就是事务。 事务有四个特性&#xf…

<项目代码>YOLOv8 车牌识别<目标检测>

项目代码下载链接 <项目代码>YOLOv8 车牌识别<目标检测>https://download.csdn.net/download/qq_53332949/90121387YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题…

跨平台开发技术的探索:从 JavaScript 到 Flutter

随着多平台支持和用户体验一致性在应用程序开发中变得越来越重要,开发者面临的挑战是如何在不同平台上保持代码的可维护性和高效性。本文将探讨如何利用现代技术栈,包括 Flutter、JavaScript、HTML5、WebAssembly、TypeScript 和 Svelte,在统一的平台上进行高效的跨平台开发…

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中,主机通常通过默认网关进行网络通信。当默认网关出现故障时,网络通信会中断,影响业务连续性和稳定性。为了提高网络的可靠性和冗余性,采用虚拟路由冗余协议(VRRP)是一种…

Referer头部在网站反爬虫技术中的运用

网站数据的安全性和完整性至关重要。爬虫技术,虽然在数据收集和分析中发挥着重要作用,但也给网站管理员带来了挑战。为了保护网站数据不被恶意爬取,反爬虫技术应运而生。本文将探讨HTTP头部中的Referer字段在反爬虫技术中的应用,并…

【ArcGIS微课1000例】0135:自动生成标识码(长度不变,前面自动加0)

文章目录 一、加载实验数据二、BSM计算方法一、加载实验数据 加载专栏《ArcGIS微课实验1000例(附数据)》配套数据中0135.rar中的建筑物数据,如下图所示: 打开属性表,BSM为数据库中要求的字段:以TD_T 1066-2021《不动产登记数据库标准》为例: 计算出来的BSM如下图: 二、B…

NVR小程序接入平台/设备EasyNVR深度解析H.265与H.264编码视频接入的区别

随着科技的飞速发展和社会的不断进步,视频压缩编码技术已经成为视频传输和存储中不可或缺的一部分。在众多编码标准中,H.265和H.264是最为重要的两种。今天我们来将深入分析H.265与H.264编码的区别。 一、H.265与H.264编码的区别 1、比特率与分辨率 H.…

华硕奥创软件在线安装和离线安装方法

华硕奥创软件在线安装和离线安装方法 1. 华硕奥创软件介绍2. 华硕奥创软件在线安装2.1 第一种2.2 第二种 3. 华硕奥创软件离线安装3.1 概述3.2 华硕奥创软件离线包下载方式 4. 卸载华硕奥创软件4.1 概述4.2 华硕奥创卸载软件下载与使用方式 结束语 1. 华硕奥创软件介绍 华硕奥…

minio 分布式文件管理

一、minio 是什么? MinIO构建分布式文件系统,MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数…

A6688 JSP+MYSQL+LW+二手物品网上交易系统

二手物品网上交易系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 摘 要 随着社会经济快速发展,互联网推动了电子商务业的迅速崛起。越来越多的人们喜欢在线进行商品的交易,尤其是对于二手物品的处理&#xff0…

算法分析与设计之分治算法

文章目录 前言一、分治算法divide and conquer1.1 分治定义1.2 分治法的复杂性分析:递归方程1.2.1 主定理1.2.2 递归树法1.2.3 迭代法 二、典型例题2.1 Mergesort2.2 Counting Inversions2.3 棋盘覆盖2.4 最大和数组2.5 Closest Pair of Points2.6 Karatsuba算法&am…

Ubuntu 安装 Samba Server

在 Mac 上如何能够与Ubuntu 服务器共享文件夹,需要在 Ubuntu 上安装 Samba 文件服务器。本文将介绍如何在 Ubuntu 上安装 Samba 服务器从而达到以下目的: Mac 与 Ubuntu 共享文件通过用户名密码访问 安装 Samba 服务 sudo apt install samba修改配置文…

计算机毕设-基于springboot的青少年心理健康教育网站的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

解读数据资产管理实践白皮书(5.0版)深入学习掌握数据资产管理知识体系。

本文介绍了数据资产管理的重要性及其概述,详细阐述了数据资产管理的活动职能包括数据模型管理、数据标准管理、数据质量管理等,并强调了数据安全管理的重要性。文章还讨论了数据资产管理的保障措施和实践步骤,以及发展趋势和总结展望。 重点内…

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置,包括节点间的通信、客户端访问、安全设置等关键步骤。我…

VSCode,Anaconda,JupyterNotebook

文章目录 一. 下载VSCode并安装二. 下载Anaconda并安装1. anaconda介绍2. Anaconda的包管理功能3. Anaconda的虚拟环境管理4.Jupyter Notebook5. Jupyter Notebook使用简介6. Jupyter Notebook快捷键7.Jupyter notebook的功能扩展8. Jupyter notebook和Jupyter lab的区别 三. V…

【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

AI大模型学习笔记|神经网络与注意力机制(逐行解读)

来源分享链接:通过网盘分享的文件:详解神经网络是如何训练的 链接: https://pan.baidu.com/s/12EF7y0vJfH5x6X-0QEVezg 提取码: k924 内容摘要:本文深入探讨了神经网络与注意力机制的基础,以及神经网络参数训练的过程。以鸢尾花数…

Linux dd命令读写flash之误区

1. 问题 通常在Linux系统上需使用dd命令读写flash设备,个人最近调试了一款spi-nor flash芯片,分区分配了8MB大小的分区,是用dd命令验证读写flash时,出现校验失败。 使用如下命令读写8KB数据就会出现校验数据失败 time dd if/dev…

大数据挖掘建模平台案例分享

大数据挖掘建模平台是由泰迪自主研发,面向企业级用户的大数据挖掘建模平台。平台采用可视化操作方式,通过丰富内置算法,帮助用户快速、一站式地进行数据分析及挖掘建模,可应用于处理海量数据、高复杂性的数据挖掘任务,…