2.Rust变量

变量的声明

let关键字

在Rust中变量必须要先声明才能使用,let关键字用于声明变量并将一个值绑定到该变量上。如下:

fn main() {let var_name:i32 = 123123;println!("{}",var_name) //println! 是一个宏(macros),可以将文本输出到控制台(相当于js console.log)。
}

let声明的关键字具有模式解构功能。(怎么理解呢?相当于js中的解构赋值)

let声明变量的特点

1.模式解构:模式解构是一种用于匹配和解构数据的语法。Rust会尝试将等号右边的值与模式(=号左边的就是模式)进行匹配,并将匹配的部分绑定到变量上。
下面是一些场景的解构示例,看不懂不要着急,后面学了数据类型就明白了。

let (x, y, _) = (1, 2, 3); // 忽略元组的第三个元素
let [a, b, c] = [1, 2, 3]; // 解构数组
let Point { x, y } = Point { x: 1, y: 2 }; // 解构结构体
let Some(value) = Some(5); // 解构Option枚举类型的Some变体

2.只读的let声明的变量是只读的如果我们修改会报错,例如:

fn main() {let var_name:i32 = 123123;var_name = 111;println!("{}",var_name);
}

报错如下:
报错如下
我们可以看到也给我们提示了,不能给不可变变量var_name赋值两次,help中提示了我们可以使用mut关键字来让该变量变成可变的

 fn main() {let mut var_name:i32 = 123123;var_name = 111;println!("{}",var_name);
}

变量遮蔽

在Rust中当我们在同一作用域下声明同名变量,后声明的会“遮蔽”前面声明的变量,例如:

fn main() {let var_name:i32 = 123123;println!("{}",var_name); // 123123let var_name = "www";println!("{}",var_name); // www
}

冻结

什么是冻结?
当数据被相同的名称不变地绑定时,它还会冻结(freeze)。在不可变绑定超出作用域之前,无法修改已冻结的数据:

fn main() {let mut _mutable_integer = 7i32;{// 被不可变的 `_mutable_integer` 遮蔽let _mutable_integer = _mutable_integer;// 报错!`_mutable_integer` 在本作用域被冻结_mutable_integer = 50;// 改正 ^ 注释掉上面这行// `_mutable_integer` 离开作用域}// 正常运行! `_mutable_integer` 在这个作用域没有冻结_mutable_integer = 3;
}

使用场景

1.当我们使用变量时,需要把变量转换成另一个类型的变量,但是不改变其变量名。

fn main() {let num1:i32 = 123;let num1:i64 = 13222;
}

2.当我们需要修改变量可变性时,可以声明一个可变的变量,之后我们希望他不可变,变成只读的。

fn main() {let mut v = 123;v = 555;let v = v ;//此时v只读
}

Static静态变量

语法

fn main(){static CONFIG = "localhost"
}

特点
用关键字

  1. static声明的变量,其生命周期是整个程序启动到退出。
  2. 占用的内存空间在程序执行过程中不会回收。
  3. static声明的变量同样具有模式匹配效果。

使用要注意的地方

由于Rust十分注意内存安全,因此全局变量使用有一些限制,防止程序员写出不安全的代码。

  1. 全局变量声明时必须初始化。
  2. 全局变量初始化时必须是编译时可以确定的常量。(不能是函数调用/表达式)
fn main() {static VERSION: &str = "1.0.0"; //√let x = 1 let y = 2static VERSION:i32 = x + y;// ×static VERSION = fn() // ×
}
  1. 带有mut修饰的全局变量,在修改时,必须用unsafe关键字。(不建议使用)
fn main() {static mut VERSION:&str = "static";unsafe{VERSION = "mut static";println!("{}",VERSION);}
}

Const常量

使用const关键字声明的称为常量,常量不允许用mut关键字修饰
语法

fn main() {const VERSION: & str = "const var";println!("{}",VERSION);
}

特点

  1. const声明常量不具备模式匹配功能。
  2. 同样必须声明时初始化。
  3. 编译器并不一定会给const声明常量分配内存。(在Rust中,const声明的常量是编译时常量(compile-time constants)。与变量不同,常量的值在编译期间就已知,而不是在运行时分配内存来存储常量的值,并且被直接嵌入到生成的二进制文件中。因此,对于常量,编译器通常不需要为其分配内存。)

变量作用域

每个声明的变量都有其有效范围。Rust中{}就代表一个作用域,在花括号内声明的变量知道当前作用域结束前都是有效的

{                      // str 在这里无效,它尚未声明let str = "hello";   // 从此处起,str 是有效的
}      
// str就被内存释放了

总结

  1. 声明变量/常量需要使用关键字let,const,static
  2. 如果声明的变量需要修改要加上mut关键字。
  3. 对于letstatic声明的变量可以使用模式解构。
  4. 变量在使用前必须初始化否则会报错。
  5. 常量和静态变量都需要在声明时初始化切值不能为表达式和函数调用。

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

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

相关文章

C#与欧姆龙PLC实现CIP通讯

参考文档: 欧姆龙PLC使用-CSDN博客 CIP通讯介绍(欧姆龙PLC)-CSDN博客 使用NuGet添加引用:CIPCompolet 基础参考我的CIP协议介绍,默认TCP端口为:44818 类NXCompolet 类的功能可以在安装PLC开发软件后帮…

【Transformer】single self-attention的理解与计算步骤

参考B站Enzo_Mi老师 【self-Attention|自注意力机制 |位置编码 | 理论 代码】https://www.bilibili.com/video/BV1qo4y1F7Ep?vd_source19425b683f74eeac34bde8ddf968a0d6 建议大家去看老师的原视频,讲解非常清晰,这里…

类和对象-继承

师从黑马程序员 基本语法 有些类与类之间存在特殊的关系,例如: 定义这些类时,下一级别的成员除了拥有上一级的共性,还有自己的特性。 这时候我们就可以考虑继承技术,减少重复代码 语法:class 子类&…

【鸿蒙 HarmonyOS 4.0】应用状态:LocalStorage/AppStorage/PersistentStorage

一、介绍 如果要实现应用级的,或者多个页面的状态数据共享,就需要用到应用级别的状态管理的概念。 LocalStorage:页面级UI状态存储,通常用于UIAbility内、页面间的状态共享。AppStorage:特殊的单例LocalStorage对象&…

Android Studio下载gradle超时问题解决

方法一 1. 配置根目录的setting.gradle.kts文件 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urluri ("https://maven.aliyun.com/repos…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA(Compute Unified Device Architecture)是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU(图形处理单元)的强大计算…

SpringCloudGateway全局过滤器

文章目录 全局过滤器的作用自定义全局过滤器过滤器执行的顺序 上一篇 Gateway理论与实践 介绍的过滤器,网关提供了31种,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现。 全局过滤器的作用 全局过滤器的…

App前端开发跨平台框架比较:React Native、Flutter、Xamarin等

引言 移动应用开发领域的跨平台框架正在不断演进,为开发者提供更多选择。在本文中,我们将比较几个流行的跨平台框架:React Native、Flutter和Xamarin等。讨论它们的优缺点、适用场景以及开发体验。 第一部分 React Native: 优缺点、适用场景…

大模型时代下的自动驾驶研发测试工具链-SimCycle

前言: 最近OpenAI公司的新产品Sora的发布,正式掀起了AI在视频创作相关行业的革新浪潮,AI不再仅限于文本、语音和图像,而直接可以完成视频的生成,这是AI发展历程中的又一座重要的里程碑。AI正在不断席卷着过去与我们息…

接口自动化框架(Pytest+request+Allure)

前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱。 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

python学习the sixth day

python函数进阶 一、函数多返回值 二、函数的多种参数使用 1.位置参数 2.关键字参数 3.缺省参数 设置默认值,必须放在最后面 4.不定长参数 4.总结 三、匿名函数 1.函数作为参数传递 这是计算逻辑的传递,而非数据的传递 2.lambda匿名函数 python文件操…

【vue.js】文档解读【day 3】 | 条件渲染

如果阅读有疑问的话,欢迎评论或私信!! 文章目录 条件渲染前言:v-ifv-elsev-else-iftemplate中的v-ifv-showv-if vs v-show 条件渲染 前言: 在JavaScript中,我们知道条件控制语句可以控制程序的走向&#…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要,接触了下React Native相关的知识,以一个Android开发者的视角,对React Native 项目组织和构建流程有了一些粗浅的认识,同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

阿珊详解Vue Router的守卫机制

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 问题描述:在 Windows 环境中,您希望通过一个 Python 脚本来实现特定的自动化任务,该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…

CXYGZL实现钉钉、飞书和微信全面覆盖!!!

非常欣慰能在这里与大家分享,CXYGZL已圆满实现多端互通的目标!!! 无论您是在手机、电脑还是平板上使用钉钉、企微还是飞书,只需将CXYGZL轻松集成到您的办公软件中,即可实现无缝审批处理各项任务&#xff0c…

计算机找不到msvcr120.dll的五种修复方法,轻松搞定msvcr120.dll丢失问题

当计算机系统中msvcr120.dll文件丢失时,可能会引发一系列运行问题和故障现象。msvcr120.dll是Microsoft Visual C Redistributable Package的一部分,对于许多Windows应用程序的正常运行至关重要。由于msvcr120.dll是许多软件在运行过程中依赖的重要动态链…

Java项目:44 ssm003在线医疗服务系统+jsp(含文档)

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 主要功能 前台登录: 注册用户:用户名、密码、姓名、联系电话 注册医生:医生工号、密码、医生姓名、职称、…

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包,却显示找不到依赖,刷新一下maven 7.…

基于 HBase Phoenix 构建实时数仓(2)—— HBase 完全分布式安装

目录 一、开启 HDFS 机柜感知 1. 增加 core-site.xml 配置项 2. 创建机柜感知脚本 3. 创建机柜配置信息文件 4. 分发相关文件到其它节点 5. 重启 HDFS 使机柜感知生效 二、主机规划 三、安装配置 HBase 完全分布式集群 1. 在所有节点上配置环境变量 2. 解压、配置环境…