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

news2024/12/16 18:08:30

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;   // 6
    let x = x * 2;   // 12
    println!("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.coloradmin.cn/o/2260641.html

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

相关文章

OpenCV中的识别图片颜色并绘制轮廓

一、实验原理 使用OpenCV库在图像中识别和绘制特定颜色(黄色)的轮廓 二、实验代码 import cv2 import numpy as np# 读取图片并调整大小 img cv2.imread(./color_1.png) img cv2.resize(img,(600,600))# 将图片从BGR颜色空间转换到HSV颜色空间 img_h…

【Qt】qt基础

目录 一、使用Qt Creator创建qt项目 二、项目文件解析 三、Qt中创建图形化界面的程序的两种方法 四、对象树 五、Qt中处理打印乱码问题的利器:qDebug() 一、使用Qt Creator创建qt项目 1.选择项目模板 选中第一类模板Application(Qt应用程序,包含普…

Transformer入门(6)Transformer编码器的前馈网络、加法和归一化模块

文章目录 7.前馈网络8.加法和归一化组件9.组合所有编码器组件构成完整编码器 7.前馈网络 编码器块中的前馈网络子层如下图所示: 图1.32 – 编码器块 前馈网络由两个带有ReLU激活函数的全连接层组成。全连接层(Fully Connected Layer)有时也…

AI智算-k8s部署大语言模型管理工具Ollama

文章目录 简介k8s部署OllamaOpen WebUI访问Open-WebUI 简介 Github:https://github.com/ollama/ollama 官网:https://ollama.com/ API:https://github.com/ollama/ollama/blob/main/docs/api.md Ollama 是一个基于 Go 语言开发的可以本地运…

HTML/CSS总结

HTML 1.1 标题标签h 为了使网页更具有语义化&#xff0c;我们经常会在页面中用到标题标签&#xff0c;HTML提供了6个等级的标题&#xff0c;即 标题标签语义&#xff1a; 作为标题使用&#xff0c;并且依据重要性递减 其基本语法格式如下&#xff1a; <h1> 标题文本…

信号处理:概念、技术、领域

目录 基本概念 主要技术 应用领域 信号处理是一个涉及分析、修改和再生信号的多学科领域。信号可以是各种形式的&#xff0c;例如声音、图像、视频或其他类型的监测数据。信号处理的主要目标是提取有用的信息并增强信号的质量。以下是信号处理的一些基本概念和应用&#xff…

黑盒白盒测试

任务1 黑盒测试之等价类划分法 【任务需求】 【问题】例&#xff1a;某报表处理系统要求用户输入处理报表的日期&#xff0c;日期限制在2003年1月至2008年12月&#xff0c;即系统只能对该段期间内的报表进行处理&#xff0c;如日期不在此范围内&#xff0c;则显示输入错误信息…

深度学习物体检测之YOLOV5源码解读

V5比前面版本偏工程化,项目化,更贴合实战 一.V5版本项目配置 (1)整体项目概述 首先github直接查找yolov5&#xff0c;下载下来即可。在训练时&#xff0c;数据是怎么处理的&#xff1f;网络模型架构是怎么设计的(如各层的设计)&#xff1f;yolov5要求是大于python3.8与大于等…

Go 怎么做性能优化芝麻开门篇

一、性能优化的流程 我们在对某个功能&#xff08;或单个接口&#xff09;做性能优化的时候。一般是该功能&#xff08;或接口&#xff09;性能无法满足我们的业务要求&#xff0c;所以被迫优化。在开始优化之前&#xff0c;我们需要明白一些理论知识。 1、常见的性能优化指标…

【Elasticsearch入门到落地】4、Elasticsearch的安装

接上篇《3、es与mysql的概念对比》 上一篇我们学习了Elasticsearch与Mysql的概念与区别。本篇我们来进行Elasticsearch的环境准备及软件安装。 一、环境准备 如果我们没有自己的Linux服务器&#xff0c;且现在正在使用的是Windows操作系统的电脑&#xff0c;那么首先我们需要安…

CRYPTO密码学

加解密算法/编码 哈希算法SM3SHA-3base家族GBGB18030GB2312GBKutf家族恺撒二进制分区法unicodeASCIIDSADSSCRC32校验对称非对称gbk编码h264SEA初探smc动态代码保护四方密码曼彻斯特编码剖析基本概念什么是编码?什么是加密与解密寻找银弹-有没有无法破解的密码通过Java代码入门…

我们来学mysql -- 探讨win安装方式(安装篇)

题记 书接上回&#xff0c;在我们来学mysql – 闲聊(安装篇)中&#xff0c;拿到安装包&#xff0c;当宝贝一样揣在怀里 然而&#xff0c;还没捂热乎&#xff0c;得粉丝秘报&#xff0c;U哥&#xff0c;上篇文章用了滞后的官方文档&#xff0c;哈哈哈…内心的小倔强&#xff0c…

pip 如何快速安装包

一、问题描述 当使用Python通过pip安装一些包时&#xff0c;pip默认是访问的国外的源&#xff0c;但在国内访问又是异常的慢&#xff0c;而且还经常因为网络问题导致安装失败&#xff0c;比如下面通过pip install jupyter来安装jupyter Notebook&#xff0c;这网速真的超级慢&…

CodeBook-Ubuntu-sandbox Linux 沙箱服务 docker pull

CodeBook-Ubuntu-sandbox Linux 沙箱服务 开源技术栏 这是一个多用户的 Linux SSH 服务沙箱&#xff0c;支持启动时动态加载用户列表&#xff0c;并可随时更新用户信息。每个用户仅能修改自己目录下的文件&#xff0c;确保了环境的安全性和隔离性。 目录 文章目录 CodeBook-…

【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)

1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom&#xff1a; dataZoom: [{type: inside, // inside 鼠标左右拖图表&#xff0c;滚轮缩放&#xff1b; slider 使用滑动条start: 0, // 左边的滑块位置&#xff0c;表示从 0 开始显示end: 60, // 右边的滑块位置&#xf…

【数据分享】2014-2024年我国POI兴趣点数据(免费获取/来源于OSM地图)

POI是Point of Interest的简称&#xff0c;意为“兴趣点”&#xff0c;是互联网电子地图中用于表示特定位置的地理实体的核心数据类型。POI通常用于标注具体地点&#xff0c;例如餐厅、商场、学校、医院、景点等。这些数据以点的形式呈现&#xff0c;并附带详细属性信息&#x…

使用html和JavaScript实现一个简易的物业管理系统

码实现了一个简易的物业管理系统&#xff0c;主要使用了以下技术和功能&#xff1a; 1.主要技术 使用的技术&#xff1a; HTML: 用于构建网页的基本结构。包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。设置字体、颜色、边距、对齐方式等样式。 JavaScript…

SSM 垃圾分类系统——高效分类的科技保障

第五章 系统功能实现 5.1管理员登录 管理员登录&#xff0c;通过填写用户名、密码、角色等信息&#xff0c;输入完成后选择登录即可进入垃圾分类系统&#xff0c;如图5-1所示。 图5-1管理员登录界面图 5.2管理员功能实现 5.2.1 用户管理 管理员对用户管理进行填写账号、姓名、…

ip_done

文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS&#xff0c;以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱&#xff0c;构建公司的子网&#xff0c;具有公司级别的入口路由器 2&#xff0e;为什么要这样呢?? IP地…

排序算法(5):归并排序

问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 归并排序 归并排序采用分治法&#xff0c;将序列分成若干子序列&#xff0c;每个子序列有序后再合并成有序的完整序列。 在数组排序中&#xff0c;如果只有一个数&#xff0c;那么它本身就是有序的。如果有两个数&#xff0…