【Rust自学】3.1. 变量与可变性

3.1.0. 写在正文之前

欢迎来到Rust自学的第三章,一共有6个小节,分别是:

  • 变量与可变性(本文)
  • 数据类型:标量类型
  • 数据类型:复合类型
  • 函数和注释
  • 控制流:if else
  • 控制流:循环

通过第二章的小游戏(没看的初学者强烈建议看一下),相信你已经学会了基本的Rust语法,而在第三章我们将更深一层,了解Rust中的通用的编程概念。

喜欢的话记得点赞、收藏加关注哦,想要跟着学习可以关注专栏哦

3.1.1. 可变/不可变变量的声明

  • 声明变量使用let关键字

  • 默认情况下,变量是不可变的。以下是错误例,报错内容在注释里:

fn main(){let machine = 6657;machine = 0721; //Error: cannot assign twice to immutable varibleprintln!("machine is {}", machine);
}
  • let后加上mut才能声明可变变量。以下是成功例,输出内容在注释里:
fn main(){let mut machine = 6657;machine = 721;println!("machine is {}", machine);//Output: machine is 721
}

3.1.2 变量与常量

有很多人在刚开始学Rust的时候都会搞不清不可变变量与常量(constant)的区别在哪里。常量在绑定值后也是不可变的,但它与不可变变量的区别很大:

  • 常量不能使用mut,一旦声明就不可变。
  • 声明常量需要使用const关键字,它的类型必须被显示标注;不可变变量可以不显示标准。
  • 常量可以在任何作用域内声明,包括全局作用域。
  • 常量只能绑定到常量表达式,无法绑定到函数的调用结果或只能在运行时才能计算出的值
  • 在程序运行期间,常量在其声明的作用域中一直有效。
  • 命名规范:Rust里常量使用全大写字母,每个单词之间用下划线分开,例如:MAX_POINTS

常量声明的例子:

const WJQ: i32 = 66570721;  
fn main(){  const WJQ_MACHINE:u32 = 6_657;  let mut machine = 6657;  machine = 721;  println!("machine is {}", machine);//Output: machine is 721  println!("WJQ is {}", WJQ);//Output: WJQ is 66570721  println!("WJQ_MACHINE is {}", WJQ_MACHINE);//Output: WJQ_MACHINE is 6657  
}

其中的i32u32是其类型。Rust支持插入下划线增强可读性,这个例子中的6_657写成6657也是可以的。这个常量既可以在全局,也可以声明在main函数里,也可以在其他作用域中。

3.1.3 隐藏(Shadowing)

在之前的小游戏程序中声明变量时就提过一嘴,Rust允许使用同名新变量来隐藏原来同名的新变量,学名叫做类型遮蔽当一个变量、函数或类型的名称在当前作用域中被重新定义时,隐藏了外部作用域中同名的变量、函数或类型),每次遮蔽时,原变量的值和类型都会被新变量替代。它允许代码复用这个变量名而无需声明新的变量。

这里可以举一个例子:

fn main(){
let a = 1;
println!("{}",a);
let a = "one";
println!("{}",a);
}

这么做程序不会报错,并且打印出了:

1
one

当程序执行到第二行时,a被赋值为1,所以打印出的是1;在第四行,程序注意到a被复用了,就会抛弃原来的值1,把a赋值为"one",所以下一行打印的就是one。这就是类型遮蔽

要注意的是,使用类型遮蔽和把变量声明为可变变量是由不同之处的:

  • 在类型遮蔽中,使用let声明的新变量依然是不可变变量
  • 在类型遮蔽中,使用let声明的同名新变量的类型可以与之前不同
fn main(){let machine = "wjq";let machine = 6657;println!("{}",machine);
}

上边这个程序使用了类型遮蔽,不会报错。第二次 let machine = 6657; 是新声明的变量,与之前的 machine 并没有关系。

fn main(){  let mut machine = "wjq";  machine = 6657;  println!("{}",machine);//Error: expected `&str`, found integer
}

上边这个程序使用了可变变量,Rust 是强类型语言,变量的类型在首次声明时确定,赋值 machine = 6657 试图将一个整数赋值给一个字符串类型变量,类型不匹配,导致编译错误:expected &str, found integer

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

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

相关文章

基于vue框架的的校园二手市场交易平台8k655(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:学生,大学,商品分类,商品信息,在线咨询 开题报告内容 基于Vue框架的校园二手市场交易平台开题报告 一、课题意义 (一)理论意义 本课题旨在研究基于Vue框架的校园二手市场交易平台的设计与实现。当前&#xff…

3D计算机视觉概述

3D计算机视觉 3D计算机视觉概述 像机标定 文章目录 3D计算机视觉前言一、人类视觉二、计算机视觉2.1 计算机视觉的研究目的2.2 计算机视觉的研究任务2.3 计算机视觉的研究方法2.4 视觉计算理论2.5 马尔框架中计算机视觉表达的四个层次2.5.1 图像(像素表达&#xff…

操作系统(13)虚拟存储器

前言 操作系统中的虚拟存储器是一项关键技术,它为用户提供了一个远大于实际物理内存容量的逻辑内存空间。 一、定义与原理 虚拟存储器是具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统。其逻辑容量由内存容量与外存容量之和决定&…

【实用技能】如何运用Visual Paradigm快速创建团队的项目模板

从 Visual Paradigm 17.2 ()版开始,您可以创建自己的项目模板并与团队共享。这样团队成员就可以轻松创建符合团队标准的新项目。本文将指导您完成为团队创建项目模板的过程。 Visual Paradigm v17.2试用版下载 先决条件 您的团队必须使用 …

不良人系列-复兴数据结构(栈和队列)

个人主页:爱编程的小新☆ 不良人经典语录:“相呴相济 玉汝于成 勿念 心安” 目录 一. 栈(stack) 1. 栈的概念 2. 栈的常见方法 3.栈的模拟实现 ​编辑 二. 队列 1. 队列的概念 2. 队列的使用 2.1 队列的常见方法 2.2 队列的模拟实现 2.3 队列…

【Linux网络】网络基础:IP协议

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀ IP协议 IP协议基本概念协议头格式分片与组装网段划分子网掩码特殊的IP地址 IP地址的数量限制…

数据结构——常见数据结构和应用

数据结构是计算机科学中的一个基本概念,它涉及数据的组织、管理和存储方式。以下是对数据结构的详细解释: 一、定义与组成 数据:描述事物的符号记录,是计算机程序的输入和输出。它可以以多种形式存在,如数字、文字、…

Linux正则化与三剑客速成(一)

目录 1.正则化 1.1正则表达式(RE) 1.2 正则表达式的注意事项 1.3正则表达式的分类 1.4 基本正则表达式 ^:表示匹配文本中以某个字符串开头的行。 $:表示匹配以某个字符串结尾的文件内的行 ^$:表示空行,但是在Linux中的实际的操作中一…

HarmonyOS 非线性容器LightWeightMap 常用的几个方法

LightWeightMap可用于存储具有关联关系的key-value键值对集合,存储元素中key值唯一,每个key对应一个value。 LightWeightMap依据泛型定义,采用轻量级结构,初始默认容量大小为8,每次扩容大小为原始容量的两倍。 集合中k…

Docker的容器

目录 1. 什么是容器?2. 容器的生命周期2.1 容器处理OOM事件2.2 容器异常退出2.3 容器暂停 3. 容器命令详解3.1 容器命令清单3.2 docker create命令3.3 docker run命令3.4 docker ps命令3.5 docker logs命令3.6 docker attach命令3.7 docker exec命令3.8 docker stat…

《红队蓝队在网络安全对抗演练中的运作模式》

在网络安全领域,红队与蓝队的对抗性演练是一个复杂且系统的过程,主要包括以下阶段: 一、演练规划阶段 确定目标和范围 组织首先要明确演练的目的,例如测试新部署的网络安全防御系统的有效性、评估员工对网络安全威胁的应对能力或者…

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器)

完整代码见:zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量,用于控制渲染 GL_POINTS 型图元时,点的大小。可用于粒子系统。将其设置为 gl_Position.z 时,可以使点…

Excel/VBA 正则表达式归纳汇总

1.with结构。以下语句用来提取A列中的“成品”两个字前面的部分的中文,不含成品两个字,结果存放在第2列。使用了On Error Resume Next,表示错误时继续下一条。 Sub 提取口味() Set regx CreateObject("vbscript.regexp") On Err…

CodeMirror 如何动态更新definemode

CodeMirror 如何动态更新definemode 问题描述:解决方法: 问题描述: 项目中有一部分用到了CodeMirror组件,其高亮显示的内容需要根据最新的json动态的更新,需要使用definemode自定义高亮内容。 想要的效果如下&#xf…

深度与视差的关系及其转换

深度与视差的关系及其转换 在计算机视觉和立体视觉中,深度和视差是两个重要的概念。理解这两者之间的关系对于实现立体图像处理、三维重建以及深度估计至关重要。在这篇博客中,我们将深入探讨深度和视差的概念,并介绍它们之间的转换关系。 …

用户发送请求后服务端i/o工作过程

华子目录 服务端i/o介绍磁盘i/o机械磁盘的寻道时间、旋转延迟和数据传输时间常见的机械磁盘平均寻道时间值常见磁盘的平均延迟时间每秒最大IOPS的计算方法 网络i/o网络I/O处理过程磁盘和网络i/o 一次完整的请求在内部的执行过程 服务端i/o介绍 i/o在计算机中指Input/Output&am…

http的MIME类型

在 HTTP 协议中,MIME 类型(Multipurpose Internet Mail Extensions)用于描述传输内容的类型和格式。MIME 类型通过 Content-Type 头字段来指定,告知客户端如何处理和显示接收到的数据。 常见的 MIME 类型 以下是一些常见的 MIME…

智能人体安全防护:3D 视觉技术原理、系统架构与代码实现剖析

随着工业化程度的提高,生产安全已成为企业关注的重点。尤其是在一些存在禁区的工业厂区和车间,人员误入或违规进入将带来严重的安全隐患。为了解决这一问题,迈尔微视推出了智能人体安全检测解决方案,为企业提供全方位的人员安全监…

sqlalchemy异步方法使用

建立模型 创建基类base.py from sqlalchemy.orm import DeclarativeBaseclass Base(DeclarativeBase):pass以用户为例,建立用户模型继承基类 from sqlalchemy import Integer, String, ForeignKey, DateTime, Boolean from sqlalchemy.orm import mapped_column, Ma…

暂停window11自动更新

window11 的自动更新功能,一方面在后台占用资源,容易导致电脑卡顿;另一方面,“更新并关机” 和 “更新并重启” 的设置令人极其反感。很多补丁兼容性很差,更新后极易引发电脑蓝屏、闪屏等意想不到的 bug。 1.winR打开运…