Rust-变量

Rust的变量必须先声明后使用。对于局部变量,最常见的声明语法为:

let variable:i32 =100;

与传统的C/C++语言相比,Rust的变量声明语法不同。这样设计主要有以下几个方面的考虑。

  1. 语法分析更容易
    从语法分析的角度来说,Rust的变量声明语法比C/C++语言的简单,局部变量声明一定是以关键字let开头,类型一定是跟在冒号:的后面。语法歧义更少,语法分析器更容易编写。

  2. 方便引入类型推导功能
    Rust的变量声明的一个重要特点是:要声明的变量前置,对它的类型描述后置。这也是吸取了其他语言的教训后的结果。

    因为在变量声明语句中,最重要的是变量本身,而类型其实是个附属的额外描述,并非必不可少的部分。

    如果我们可以通过上下文环境由编译器自动分析出这个变量的类型,那么这个类型描述完全可以省略不写。

    Rust一开始的设计就考虑了类型自动推导功能,因此类型后置的语法更合适。

  3. 模式解构
    let语句不光是局部变量声明语句,而且具有pattern destructure(模式解构)的功能。

实际上,包括C++/C#/Java等传统编程语言都开始逐步引入这种声明语法,目的是相似的。

Rust中声明变量缺省是“只读”的,比如如下程序:
在这里插入图片描述
如果我们需要让变量是可写的,那么需要使用mut关键字:
在这里插入图片描述
let语句在此处引入了一个模式解构,我们不能把let mut视为一个组合,而应该将mut x视为一个组合。

mut x是一个“模式”,我们还可以用这种方式同时声明多个变量:

在这里插入图片描述
Rust中,每个变量必须被合理初始化之后才能被使用。使用未初始化变量这样的错误,在Rust中是不可能出现的(利用unsafe做hack除外)。

在这里插入图片描述
Rust里面的下划线是一个特殊的标识符,在编译器内部它是被特殊处理的。它跟其他标识符有许多重要区别。比如,以下代码就编译不过:
在这里插入图片描述

变量遮蔽

Rust允许在同一个代码块中声明同样名字的变量。如果这样做,后面声明的变量会将前面声明的变量“遮蔽”(Shadowing)起来。

在这里插入图片描述
从第5行开始,一直到这个代码块结束,我们没有任何办法再去访问前一个x变量,因为它的名字已经被遮蔽了。

变量遮蔽在某些情况下非常有用,比如,我们需要在同一个函数内部把一个变量转换为另一个类型的变量,但又不想给它们起不同的名字。

再比如,在同一个函数内部,需要修改一个变量绑定的可变性。

例如,我们对一个可变数组执行初始化,希望此时它是可读写的,但是初始化完成后,我们希望它是只读的。

在这里插入图片描述
反过来,如果一个变量是不可变的,我们也可以通过变量遮蔽创建一个新的、可变的同名变量。
在这里插入图片描述

类型推导

Rust的类型推导功能是比较强大的。它不仅可以从变量声明的当前语句中获取信息进行推导,而且还能通过上下文信息进行推导。

在这里插入图片描述
我们甚至还可以只写一部分类型,剩下的部分让编译器去推导,比如下面的这个程序,我们只知道players变量是Vec动态数组类型,但是里面包含什么元素类型并不清楚,可以在尖括号中用下划线来代替:

在这里插入图片描述
自动类型推导和“动态类型系统”是两码事。

Rust依然是静态类型的。

一个变量的类型必须在编译阶段确定,且无法更改,只是某些时候不需要在源码中显式写出来而已。

这只是编译器给我们提供的一个辅助工具。
Rust只允许“局部变量/全局变量”实现类型推导,而函数签名等场景下是不允许的,这是故意这样设计的。

这是因为局部变量只有局部的影响,全局变量必须当场初始化而函数签名具有全局性影响。

函数签名如果使用自动类型推导,可能导致某个调用的地方使用方式发生变化,它的参数、返回值类型就发生了变化,进而导致远处另一个地方的编译错误,这是设计者不希望看到的情况。

类型别名

我们可以用type关键字给同一个类型起个别名(type alias)。示例如下:
在这里插入图片描述
类型别名还可以用在泛型场景,比如:
在这里插入图片描述
type Double=(T,Vec);//小括号包围的是一个tuple,请参见后文中的复合数据类型那么以后使用Double的时候,就等同于(i32,Vec),可以简化代码。

静态变量

Rust中可以用static关键字声明静态变量。如下所示:

static GLOBAL:i32 =0;

与let语句一样,static语句同样也是一个模式匹配。与let语句不同的是,用static声明的变量的生命周期是整个程序,从启动到退出。

static变量的生命周期永远是’static,它占用的内存空间也不会在执行过程中回收。这也是Rust中唯一的声明全局变量的方法。

由于Rust非常注重内存安全,因此全局变量的使用有许多限制。这些限制都是为了防止程序员写出不安全的代码:

  • 全局变量必须在声明的时候马上初始化;
  • 全局变量的初始化必须是编译期可确定的常量,不能包括执行期才能确定的表达式、语句和函数调用;
  • 带有mut修饰的全局变量,在使用的时候必须使用unsafe关键字。
    在这里插入图片描述
    Rust不允许用户在main函数之前或者之后执行自己的代码。所以,比较复杂的static变量的初始化一般需要使用lazy方式,在第一次使用的时候初始化。在Rust中,如果用户需要使用比较复杂的全局变量初始化,推荐使用lazy_static库。

常量

在Rust中还可以用const关键字做声明。如下所示:

const GLOBAL: i32 =0;

编译器并不一定会给const常量分配内存空间,在编译过程中,它很可能会被内联优化。

因此,用户千万不要用hack的方式,通过unsafe代码去修改常量的值,这么做是没有意义的。

以const声明一个常量,也不具备类似let语句的模式匹配功能。

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

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

相关文章

[element-ui] 级联选择器el-cascader不触发change事件

el-cascader 使用官网的数据是可以的 官网数据中最后一级没有children // 删除最后一级的children changeKey(arr) {for (var i0; i<arr.length; i) {if (arr[i].children.length) {this.changeKey(arr[i].children)} else {delete arr[i].children}} ]就可以了 参考&…

JavaScript高级程序设计读书记录(十二):函数

函数是ECMAScript中最有意思的部分之一&#xff0c;这主要是因为函数实际上是对象。每个函数都是Function 类型的实例&#xff0c;而 Function 也有属性和方法&#xff0c;跟其他引用类型一样。因为函数是对象&#xff0c;所以函数名就是 指向函数对象的指针&#xff0c;而且不…

蓝凌EIS智慧协同平台 frm_form_upload.aspx 文件上传漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 蓝凌EIS智慧协同平台 frm_form_upload.aspx接口处存在任意文件上传漏洞,未经过身份认证…

李沐之使用块的网络VGG

目录 1.VGG 2.代码实现 1.VGG n层是指可以有N个窗口3*3&#xff0c;填充为1的卷积层。有m个通道&#xff0c;这里输入和输出都是一样的。 VGG就是替换掉AlexNet整个卷积层的架构。 直径大小表示占内存&#xff0c;横坐标表示速度&#xff0c;纵坐标表示精确度。 2.代码实现 …

搭建算法日志自检小系统

&#x1f952; 前言 目前演示的是一个工具&#xff0c;但如此&#xff0c;未来完成有潜力可以演变为一整套系统。 &#x1f451;现场人员自检失败表计点位教程V2.0 NOTE: 如果没有“logfiles-meter-tool“目录的请联系我们进行提供&#xff01; &#x1f447; 进入<dist>…

构建基于RHEL7(CentOS7)的OpenSSH9.5p1的RPM包和升级回退方案

本文适用&#xff1a;RHEL7系列&#xff0c;或同类系统(CentOS7等) 文档形成时期&#xff1a;2023年 因软件世界之复杂和个人能力之限&#xff0c;难免疏漏和错误&#xff0c;欢迎指正。 文章目录 环境准备安装依赖openssh-9.5p1-el7.spec内容构建RPM包下载安装前注意事项开启t…

C语言用函数指针实现计算器

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现目录函数&#xff1b; void menum() {//打印目录&#xff1b;printf("***********************************************\n");printf("***…

如何在“Microsoft Visual Studio”中使用OpenCV构建应用程序

我在这里描述的所有内容都将应用于 OpenCV 的界面。我首先假设您已经阅读并成功完成了 Windows 中的安装教程。因此&#xff0c;在进一步操作之前&#xff0c;请确保您有一个包含 OpenCV 头文件和二进制文件的 OpenCV 目录&#xff0c;并且您已按照此处所述设置环境变量 设置 O…

养猫家庭怎么挑选宠物空气净化器?猫用空气净化器推荐来了!

宠物空气净化器在近年来越来越受到关注&#xff0c;它们被宣传为解决宠物家庭空气质量问题的神器。然而&#xff0c;一些人认为宠物空气净化器只是商家们利用人们对宠物的爱而推出的一种所谓的“智商税”&#xff0c;那么作为一位养猫多年的铲屎官&#xff0c;我可以说宠物空气…

[windows]一种判断exe是32位还是64位程序简单方法

不用运行&#xff0c;直接查看 exe 文件的兼容性属性。 如果是 32 位的程序&#xff0c;“简化的颜色模式”和“用 640x480 屏幕分辨率运行”是可以勾选的&#xff0c;且兼容模式最低可以调到 Windows 95。 而 64 位的程序&#xff0c;“简化的颜色模式”和“用 640 x 480 屏…

在线项目实习分享:股票价格形态聚类与收益分析

01前置课程 数据挖掘基础数据探索数据预处理数据挖掘算法基础Python数据挖掘编程基础Matplotlib可视化Pyecharts绘图 02师傅带练 行业联动与轮动分析 通过分析申银万国行业交易指数的联动与轮动现象&#xff0c;获得有意义的行业轮动关联规则&#xff0c;并在此基础上设计量…

华云安攻击面发现及管理平台体验

省流&#xff1a; 无需【立即咨询】即可体验&#xff0c;开通即可查看演示数据&#xff0c;公开报价 界面&#xff1a; 界面简洁&#xff0c;要点清晰&#xff0c;可以清晰的看到暴露面及攻击面信息 功能&#xff1a; 资产发现&#xff1a;主域名发现、子域名发现、 IP 发现…