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;   // 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决,一是同步化供应链消减从需求到供应的放大效应,二是供应链细分,针对不同的客户、不同的需求供应的匹配策略来应对复杂性,更好的满足客户并以最低的总成本来实现。 对…

多模态大模型(二)——用Transformer Encoder和Decoder的方法(BLIP、CoCa、BEiTv3)

文章目录 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 理解、生成我都要,一个很有效的、根据图片生成caption的工具1. BLIP的研究动机2. BLIP的模型结构3. CapFilt Model4. BLIP的训练过程 CoCa: C…

可视化报表如何制作?一文详解如何用报表工具开发可视化报表

在如今这个数据驱动的商业时代,众多企业正如火如荼地推进数字化转型,力求在激烈的市场竞争中占据先机。然而,随着业务规模的扩大和运营复杂度的提升,企业的数据量爆炸式增长,传统报表格式单一、信息呈现密集且不易解读…

基于XML配置Bean和基于XML自动装配

目录 基于XML配置Bean id分配规则 通过id获取bean 通过类型获取bean 通过C命名空间配置bean 使用C命名空间 通过P命名空间配置bean 通过util:list进行配置bean 指定id,直接ref引用过来 通过外部属性文件配置Bean Bean信息重用(继承)…

(九)机器学习 - 多项式回归

多项式回归(Polynomial Regression)是一种回归分析方法,它将自变量 xx 和因变量 yy 之间的关系建模为 nn 次多项式。多项式回归的目的是找到一个 nn 次多项式函数,使得这个函数能够最好地拟合给定的数据点。 多项式回归的数学表达…

Leetcode 每日一题9.回文数

🌈🌈🌈今天给大家分享的是:回文数的解法 目录 ​编辑 问题描述 输入输出格式 示例 约束条件 进阶挑战 解决方案 问题分析 过题图片 字符串转换法 数学方法 算法解释 题目链接 结论 问题描述 给定一个整数 x,我们需要…

美团2024年秋招第一场笔试【前端移动端】

美团2024年秋招第一场笔试【前端&移动端】 2024/12/12 1.在一个长度为28的数组中删除第5个元素时(元素序号:1~28),需要向前移动(23)个元素。 2.如下图一个树型结构,其结点E在树的中序遍历…

光谱相机

光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上,在探测器前设置分光元件,如光栅、棱镜或滤光片等,将光按不同波长分解成多个光谱通道&#xff0c…

Oracle plsqldev1106 安装及TNS配置

Oracle plsqldev1106 安装及TNS配置 下载好安装包,直接双击安装 点击 I Agree 默认是C盘的,我改了D盘,根据自己实际情况修改 这里用默认的for current user 也可以,我选了for all user 点Finish,等待安装完成即可 …

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长 《春烂漫:新平摄影作品选》作者新平,2019.12.25年读完的小书,当时就觉得挺不错,今…

掌握 MySQL 事务:ACID、隔离级别详解

一、前言 事务是关系型数据库中的重要概念,用于保证一组数据库操作作为一个单独的工作单元来执行。无论是银行转账、订单处理还是复杂的数据修改,事务都能保证操作的一致性和完整性。 本文将带您从基础概念到高级技巧,全面了解 MySQL 事务的…

Nacos 3.0 Alpha 发布,在安全、泛用、云原生更进一步

自 2021 年发布以来,Nacos 2.0 在社区的支持下已走过近三年,期间取得了诸多成就。在高性能与易扩展性方面,Nacos 2.0 取得了显著进展,同时在易用性和安全性上也不断提升。想了解更多详细信息,欢迎阅读我们之前发布的回…

23.DDD与微服务

学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现,也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…

拍频实例 - 一组恒力矩电流采样数据

这是一组功率电机的感应电流波形。加载了重载恒力矩设备。你能看到什么? 首先,时间轴的坐标是对的,9.9~10.0秒,单位是秒,100ms有5个波形,所以是20ms一个波形。这是50Hz的信号。频差就体现为幅度的周期起伏…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

【组件介绍】FITKPlotWindow

一、组件简介 二维图表组件FITKPlotWindow基于Qwt开发&#xff0c;是用于直观二维数据的组件。目前的二维图表组件支持四种类型的图表&#xff0c;分别为标准直角坐标图、柱状图、频谱图和极坐标图。该组件的数据渲染效果示例如下&#xff1a; 二、主要接口 组件中针对不同的…

路由策略与策略路由

路由策略 常用有Router-Policy&#xff0c;Filter-Policy等 控制路由是否可达&#xff0c;通过修改路由条目相关参数影响流量的转发 基于控制平面&#xff0c;会影响路由表表项&#xff0c;但只能基于目地址进行策略判定&#xff0c;于路由协议相结合使用 Router-Policy …

软考:工作后再考的性价比分析

引言 在当今的就业市场中&#xff0c;软考&#xff08;软件设计师、系统分析师等资格考试&#xff09;是否值得在校学生花费时间和精力去准备&#xff1f;本文将从多个角度深入分析软考在不同阶段的性价比&#xff0c;帮助大家做出明智的选择。 一、软考的价值与局限性 1.1 …

批量导出工作簿中高清图片-Excel易用宝

我同事在工作簿中做了三个图表&#xff0c;现在需要将工作簿中的图标导出保存为高清图片&#xff0c;通过右键另存为保存的图片并非高清图片&#xff0c;其实要把Excel工作簿中的图表或图片对象导出为高清图片也很简单。 单击Excel易用宝 Plus&#xff0c;导出高清图片。 在导出…

mp4影像和m4a音频无损合成视频方法

第一步&#xff1a;复制高清视频地址 url 第二步:打开网址粘贴复制的视频url视频下载 第三步&#xff1a;下载-影像.mp4和-音频.m4a 第四步&#xff1a;合并视频&#xff1b; 使用ffmpeg进行无损合成&#xff08;如果没有安装ffmpeg请自行下载安装下载 FFmpeg (p2hp.com)&…