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,一经查实,立即删除!

相关文章

Spring Boot应用开发深度解析与实战案例

Spring Boot应用开发深度解析与实战案例 在当今快速发展的软件开发领域,Spring Boot凭借其“约定优于配置”的理念,极大地简化了Java应用的开发、配置和部署过程,成为了微服务架构下不可或缺的技术选型。本文将深入探讨Spring Boot的核心特性、最佳实践,并通过一个具体的…

Mybatis---事务

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

ModbusTcp获取数据

ModbusTcp获取数据 记录一个用 pymodbus 库来获取数据的代码。 注意: 1.读取寄存器地址是16进制的。2.大小端转换通过代码知道原理。读取数据时,切记频率别太高,否则会出现连接被关闭问题。 from pymodbus.client.sync import ModbusTcpCli…

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

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

闭包:JavaScript 编程中的隐形魔法

在JavaScript中,闭包是一种强大的特性,它允许函数访问其词法作用域外的变量。这种特性使得我们可以创建私有变量和持久化状态,从而编写出更加灵活和强大的代码。本文将深入探讨闭包的定义、原理以及在实际项目中的最佳实践,帮助大…

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

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

华为eNSP:VRRP

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

linux 内核传参 module_param_cb

简介 https://www.google.com.hk/url?sat&rctj&q&esrcs&sourceweb&cd&ved2ahUKEwiU1Kiz5aOKAxW0wTgGHZjnDL8QFnoECBYQAQ&urlhttps%3A%2F%2Fblog.csdn.net%2Fzongzidedandan%2Farticle%2Fdetails%2F132475615&usgAOvVaw0CR6uvFlW4mqDItx560AH…

虚幻引擎Actor类生命周期

AActor构造函数 在AActor类的构造函数中,虚幻引擎会初始化与该Actor相关的一些关键属性,比如: 默认的组件(如RootComponent、MeshComponent等)。默认的属性设置,例如位置、旋转、缩放等。还会调用BeginPlay等生命周期函数,但在构造函数中,这些函数不会执行。当你在场景…

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 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数…

对rust的全局变量使用drop方法

文章目录 rust处理全局变量的策略方法1:在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop,因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …

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

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

Pandas常见函数

Pandas 是 Python 中用于数据分析和处理的强大工具库。以下是 Pandas 中一些常见的函数和方法,按用途分类总结: 1. 数据创建 pd.Series(data, index):创建一维的序列对象。pd.DataFrame(data, index, columns):创建二维的DataFra…

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

文章目录 前言一、分治算法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实战…