2.Rust变量

news2025/1/21 8:58:17

变量的声明

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); // 123123
    let 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 = 2
    static 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.coloradmin.cn/o/1494437.html

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

相关文章

遇见未来的你——陪伴是最长情的告白

目录 一、背景介绍二、思路&方案三、过程1.家庭中彼此的陪伴最长情2.事业中与合伙人与同事与朋友与产品的陪伴最长情3.人生中与计划与落实与啊哈的陪伴最长情4.肉体与灵魂分分合合的体验 四、总结 一、背景介绍 人有时候一转身就是一辈子,所以珍惜转身的每一个…

如何计算搭建光伏电站需要多少成本?

光伏电站,又称太阳能电站,是一种利用太阳能发电的电力系统。随着全球对可再生能源的需求日益增加,光伏电站的建设变得越来越普遍。然而,在投资光伏电站之前,了解其建设成本是非常重要的。本文将介绍如何计算搭建光伏电…

96、C++ 性能优化一览

在对 C++ 版本的 resnet50 经过大约 5 个版本的优化之后,性能也基本达到了预期。至少利用手写的 resnet50 在 CPU 上推理一张图片感觉不到卡顿了。 下面对这几个版本的性能优化做一个总结。 初始版本1 第一版本的 C++ 代码,并没有考虑性能问题,仅仅是想按照手写 resnet50 …

【学习】torch.nn.CrossEntropyLoss交叉熵损失函数

交叉熵损失函数torch.nn.CrossEntropyLoss 交叉熵主要是用来判定实际的输出与期望的输出的接近程度,为什么这么说呢,举个例子: 在做分类的训练的时候,如果一个样本属于第K类,那么这个类别所对应的输出节点的输出值应…

腾讯云服务器99元一年是真的吗?只要61元!

腾讯云服务器99元一年是真的吗?假的,不要99,只要61元!又降价了!腾讯云服务器多少钱一年?61元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器165元一年、756元3年,4核16…

腾讯云服务器99元一年是真的吗?又降价,现在只要61元

腾讯云服务器99元一年是真的吗?又降价,现在只要61元。腾讯云服务器多少钱一年?61元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器165元一年、756元3年,4核16G12M服务器32元1个月、312元一年,…

【好书推荐-第九期】Sora核心技术相关书籍《扩散模型:从原理到实战》与《GPT 图解:大模型是怎样构建的》:Sora的两大核心技术,都藏在这两本书里!

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号:洲与AI。 🎈 本文专栏:本文收录…

底层day1作业

思维导图: 一.总结keil5下载代码和编译代码需要注意的事项 当使用Keil5下载代码和编译代码时,有一些需要注意的事项。以下是总结: 1. 确保正确配置目标 2. 配置编译器选项。 3. 确保正确配置连接器脚本 4. 检查编译错误和警告。 5. …

生成式模型实战—小小案例(python)

实战之前,环境需要已经搭建好。如果环境没有搭建好,可以参考PyTorch2.0 环境搭建详细步骤(Nvidia显卡)-CSDN博客 接下来,我们今天的学习之旅~ Step1. 安装类库 transformers pip install transformers Step2. 代码敬上 from transformer…

使用VS Code运行Java SpringBoot项目

本文并不详细讲 Java 项目启动前需要哪些配置,本文主要受众是平时用惯了 Idea 的 Java 程序员,仅讲解如何用 VS Code 启动服务 前提条件 Jdk、Maven、Nacos、Seata、TDengine等该配置的配置,该启动的启动,就你平时用 Idea 启动项…

力扣hot---岛屿数量

思路dfs: 首先通过两层for循环遍历每一个点,如果这个点为0或者2(这个2是什么呢?是在遍历该点以及该点连成的这一片区域中,因为通过深度优先搜索,遍历该点就等于遍历这一片区域,遍历这篇区域中的…

Qt 类的前置声明和头文件包含

1. 在头文件中引入另一个类经常有两种写法 1&#xff09;前置声明 2&#xff09;头文件包含 #ifndef FRMCOUPLE2_H #define FRMCOUPLE2_H#include <QWidget> //头文件包含namespace Ui { class frmcouple2; }//前置声明&#xff1a;QPushButton frmchkeyboard…

java网络编程 01 IP,端口,域名,TCP/UDP, InetAddress

01.IP 要想让网络中的计算机能够互相通信&#xff0c;必须为计算机指定一个标识号&#xff0c;通过这个标识号来指定要接受数据的计算机和识别发送的计算机&#xff0c;而IP地址就是这个标识号&#xff0c;也就是设备的标识。 ip地址组成&#xff1a; ip地址分类&#xff1a;…

基础小白快速入门web前端开发技术------>web概述

Web概述 我们在编程的学习中&#xff0c;随着学习的深入&#xff0c;我们会理解到WEB这个东西&#xff0c;那么 web究竟是个啥&#xff0c;到底该咋用&#xff1f; web&#xff0c;是网站的英文意思&#xff0c;又被称作“下一代Web3.0&#xff0c;互联网”&#xff0c;是在We…

2024.3.6

利用c语言通过sqlite3实现数据库增删改查&#xff1a; #include<myhead.h> int do_add(sqlite3 * ppDb) {char sql_insert[128]"insert into worker values ";char info[500]"";printf("请输入要添加的员工信息&#xff1a;\n");scanf(&…

Android开发揭秘,我了解到的面试的一些小内幕

前言 尤其是在最近一段时间内&#xff0c;感觉一天天的时间过得又慢又快&#xff0c;慢的是感觉复工了以后在公司的8.9个小时简直算是煎熬了&#xff0c;快的是常常感觉时间一天天&#xff0c;一月月的过去了&#xff0c;可是发现自己还在原路踏步走。看似每天忙成狗&#xff…

大学四年我从非科班到互联网大厂之路

文章目录 一、两度高考、依然选错&#xff1f;二、初来乍到、陷入囹圄三、破局重生、从头再来四、找实习的坎坷之路五、提前结束实习&#xff0c;开始秋招六、秋招一路凯歌七、写在最后&#xff1a;人生是一场长久的旅途 很久没来CSDN上写过文章了&#xff0c;上一次写已经是20…

HTML静态网页成品作业(HTML+CSS)——新年春节介绍网页设计制作(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示1、首页2、子页13、子页2 三、代码目录四、网站代码HTML部分代码CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0…

Android开发经典实战,Android面试题目

关于Android的近况 大家都知道&#xff0c;今年移动开发不那么火热了&#xff0c;完全没有了前两年Android开发那种火热的势头&#xff0c;如此同时&#xff0c;AI热火朝天&#xff0c;很多言论都说Android不行了。其实不光是Android&#xff0c;iOS也有类似的言论。 那么到底…

人工智能如何重新定义数据迁移:利用人工智能趋势实现工作空间的平稳过渡

【由于上篇文章中IAB关于数据迁移并没有讨论人工智能技术如何整整推动和影响未来的数据迁移工作&#xff0c;因此特整理了两篇前沿文章&#xff0c;供大家参考 - - 对第六篇关于数据迁移的一个补充&#xff08;1&#xff09;​​​​​​​】 拥抱变化&#xff1a;数据迁移的发…