Rust 的变量与可变性
在 Rust 的默认情况下,变量是不可变的,因为它为开发者提供了一个安全性和简单并发性的方式来编写代码,但是开发人员依旧可以选择使变量可以发生改变,只是使用mut
。具体例子如下:
fn main() {
// Rust的变量是一旦声明就不能改变,所以如下代码不能编译成功
// let num = 5;
// println!("The value of x is: {num}");
// num = 6;
// println!("The value of x is: {num}");
// Rust需要改变变量的时候,需要使用mut关键字
let mut num = 5;
println!("The value of x is: {num}");
num = 6;
println!("The value of x is: {num}");
}
注意:假如在原先变量的基础上进行计算后赋值的话,Rust 是允许的
let x: i32 = 5; // x = 5
let x = x + 1; // x = 6
Rust 常量
在 Rust 中常量是不允许进行修改,并且使用mut
来尝试修改常量的话会导致编译不能通过。
常量可以在任何范围内声明。包括全局范围,这使得它们对于许多代码部分需要了解的值非常有用。
常量只能是常量表达式,而不是在运行时计算的结果。具体实例如下:
const FILE_PATH = "/demo";
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
Rust 变量阴影
在 Rust 中我们可以声明一个与前面变量同名的新变量,而这个过程会让第一个变量被第二个变量进行覆盖。在重新赋值的过程中,变量名都是同一个。例如如下的代码:
// 编译能够通过
let num = 2; // num = 2
let num = num + 1; // num = 3
假如在作用域中进行同名赋予新值的话,被覆盖的变量只在作用域中起效,作用域之外会还原到之前的变量值,具体实例如下:
fn main() {
let num = 5; // num = 5
let num = num - 1; // num = 4
{
let num = num * 2;
println!("num 的值是: {num}"); // num = 8
}
println!("The value of x is: {num}"); // num = 4
}
当我们使用 let 再次声明一个同名变量的时候,相当于创建一个全新的变量,所以程序可以在编译的时候不会报错,例如如下的代码:
let name = "tom"; // 字符串类型的变量
let name = name.len(); // 数值类型的变量
上述的操作是允许的,但是我们使用 mut 进行同名变量的值修改的话是不允许的,程序在编译的时候会报错,例如:
/**
* error: expected item, found keyword `let`
* --> tempCodeRunnerFile.rs:1:1
* |
* 1 | let name = "tom";
* | ^^^ consider using `const` or `static` instead of `let` for global variables
*/
let name = "Tom";
name = name.len();