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