首页 > 其他分享 >rust笔记-变量

rust笔记-变量

时间:2023-10-19 23:13:52浏览次数:31  
标签:mut 变量 value let 笔记 rust 遮蔽

rust变量默认是不可变的,需要手动设置可变性。可变的变量给编程提供了灵活性,不可变的变量提供了安全性。而rust中需要根据实际场景来指定的变量类型。

变量声明
变量声明使用关键字 let,语法格式如下:

let 变量名 = 值;
变量声明后,变量名可以被使用,但是值不能被修改。
这种方式申请的变量是不可变的,如果需要可变,则需要使用mut关键字。
如:let mut x = 5;

我们通过下面代码来演示一下:

fn main() {
    let x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}

上面的代码中,我们声明了一个不可变的变量 x,然后打印出 x 的值,接着将 x 的值改为 6,最后打印出 x 的值。
在x = 6 这一行,编译器会报错,因为 x 是不可变的。

这种写法可以避免一些无法预期的错误,rust这种写法也有些繁琐,但是可以避免一些错误,比如一个变量在多出使用,一部分代码假定这个值永远不会改变,而有些代码却改变了这个值,这样就会导致一些无法预期的错误。特别是在多线程环境下,这种错误更加容易发生。rust这种规则,可以避免这种错误的发生,同时阅读代码也更便利。

当然可变性也是很重要的,在变量名前加一个mut关键字,就可以将变量声明为可变的。
我们将上面代码变量X前加mut关键字,如下:

fn main() {
    let mut x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}

这样,编译器就不会报错了。cargo run 运行结果如下:

$ cargo run
   Compiling variables v0.1.0 (file:///projects/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.30s
     Running `target/debug/variables`
The value of x is: 5
The value of x is: 6

变量的可变和不可变主要还是取决与具体使用场景,如果需要可变,则使用mut关键字。

tips:
1、rust 中的变量名是区分大小写的。
2、rust 中的变量名和其他语言没有区别,不能和关键字重名。
3、可以使用下划线来分割变量名开头来忽略未使用变量。声明了为使用的变量rust编译器不会报错,但是会给出警告。在变量前加“_”来忽略未使用变量。但是这个方式不推荐,代码中未使用的变量最好删除。

变量的值能不能更改我们很容易想到一个概念:常量。那么rust中的不可变变量是不是常量呢?实际上是不一样的,主要有以下差异:

  • 常量不允许使用 mut。常量不仅仅默认不可变,而且自始至终不可变,因为常量在编译完成后,已经确定它的值。
  • 常量使用 const 关键字而不是 let 关键字来声明,并且值的类型必须标注。
  • 常量可以在任意作用域内申明,且常量在整个程序运行过程中都有效。

下面是一个申明常量的例子:

const MAX_POINTS: u32 = 100_000;

变量的解构
解构(Destructuring)是 rust 中的一个概念,指的是将一个包含多个值的集合拆分成多个变量。let表达式不仅仅用于声明绑定变量,还可以用于解构,从一个复杂变量中,提取出想要的值。我们看下面的代码:

fn main() {
    let v = vec![1, 2, 3];
    let (a, b, c) = v;
    println!("a = {}, b = {}, c = {}", a, b, c);
}

tips:
使用类似“+=”的语句还不支持解构式赋值。
此处只是在变量模块稍微提一下模式匹配,后面会详细介绍。

变量遮蔽(Variable Shadowing)

在同一个作用域内,允许声明相同的变量名,在后面的声明会遮蔽前面的变量。

fn main() {
    let x = 5;
    let x = x + 1; // 遮蔽
    let x = x * 2; // 遮蔽
    println!("The value of x is: {}", x);
}

上面的程序首先将数值5赋值给变量x,然后通过let x = 遮蔽之前的x,并将x + 1赋值给x,然后将x * 2赋值给x,最后打印x的值。
这和 mut 变量的使用是不同的,第二个 let 生成了完全不同的新变量,两个变量只是恰好拥有同样的名称,涉及一次内存对象的再分配 ,而 mut 声明的变量,可以修改同一个内存地址上的值,并不会发生内存对象的再分配,性能要更好。
变量遮蔽的用处在于,如果你在某个作用域内无需再使用之前的变量(在被遮蔽后,无法再访问到之前的同名变量),就可以重复的使用变量名字,而不用绞尽脑汁去想更多的名字。但是我个人不推荐这样的作法。

tips:
1、遮蔽只发生在同一个作用域内。
2、遮蔽只发生在变量声明,不包含函数参数。

变量生命周期

变量作用域

标签:mut,变量,value,let,笔记,rust,遮蔽
From: https://www.cnblogs.com/noodles1417/p/17775943.html

相关文章

  • ASP.NET CORE学习笔记(host主机)
    1、扩展包 Microsoft.Extensions.Hosting2、包括Host、WebApplication3、示例1)honst 注意:<ProjectSdk="Microsoft.NET.Sdk">varbuilder=Host.CreateDefaultBuilder(args);varapp=builder.Build();app.Run();2)web......
  • 动态规划——决策单调性优化DP 学习笔记
    动态规划——决策单调性优化DP学习笔记决策单调性对于最优性问题,常有状态转移方程:\(f_i=\min/\max\{f_j\dots\}\),形象的:如果\(i\)的最优转移点是\(j\),\(i'\)的最优转移点是\(j'\),当\(i<i'\)时,有\(j\lej'\),则称该DP问题具有决策单调性。即:\(i\)单增,其最优转移点......
  • 基本语法——lower/upper_bound 学习笔记
    基本语法——lower/upper_bound学习笔记正文本文保证:你看了也不懂\(\texttt{lower\_bound}\)\(\texttt{upper\_bound}\)默认比较函数返回第一个\(\cancel{<}\text{value}\)的元素返回第一个\(>\text{value}\)的元素自定义比较函数返回第一个\(\texttt{f......
  • 学习笔记6 截图+代码
    一、苏格拉底挑战二、遇见的问题三、实践和代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>intmain(){char*programPath="/path/to/your/program";//指定要执行的程序的路径char*constargv[]={programPath,NULL};......
  • rustdesk 1.2.3-1 尝鲜,有很大提升空间
    产品说的很好。测试了一下电脑从archlinuxcn下的rustdesk1.2.3-1,手机端fdroid下的,版本是1.1.10-1,同一局域网,未自建服务器。电脑端启动后显示账号和一次性密码。手机输入账号密码后连接,手机画面黑屏,过一回依旧黑屏不显示,再一会断联。手机可选显示哪个桌面(一共两)。密码刷新后......
  • python学习笔记-异步非阻塞web框架
    一、异步非阻塞框架介绍1、介绍支持异步非阻塞web框架:tornado,nodejs2、定义对比异步IO模块:我们作为客户端向服务端“并发”请求异步非阻塞web框架:针对服务端,希望一个线程处理更多的请求二、tornado异步非阻塞【要点提炼】使用装饰器@gen.coroutine模拟等待,使用特殊的......
  • openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管
    openGauss学习笔记-104openGauss数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换openGauss默认配置了通过openssl生成的安全证书、私钥。并且提供证书替换的接口,方便用户进行证书的替换。104.1操作场景openGauss默认配置了SSL连接所需要的安全的证书、私钥,用户......
  • 【刷题笔记】89. Gray Code
    题目Thegraycodeisabinarynumeralsystemwheretwosuccessivevaluesdifferinonlyonebit.Givenanon-negativeinteger n representingthetotalnumberofbitsinthecode,printthesequenceofgraycode.Agraycodesequencemustbeginwith0.Exam......
  • idea 编译时 找不到符号 变量 log
    idea进行项目编译的时候报找不到符号 变量log对lombok进行了各种配置后发现还是无效后,最后进行complier配置添加-Djps.track.ap.dependencies=false ......
  • ERA5 Land中‘expver’变量的处理方法
    近日在搞数据的时候发现ERA5Land新更新的数据中有一个‘expver’的变量,导致数据并不连续。官方解释如下: ERA5每小时和每月数据延迟3个月提供。这意味着一个月后,另一个月的ERA5数据将写入数据集。ERA5T(近实时)初步数据用于填补ERA5数据结束与当前日期前5天之间的空白。当......