rust变量遮蔽(shadowing)

前言

首先要理解rust对变量的分配,rust创建一个变量之后,分配一个内存空间,变量名是对这一个内存空间的命名。

一般默认情况下,变量是不可变的,因为rust为了安全,对内存的操作是很小心的。如果想要让变量可变,需要声明mut

// 此时是对同一地址的改变
let mut x = 5;
x =6

// 此时是两个不同内存地址, 只是对不同地址,使用同一个名字命名。
// 此时第一个x被shadowing了
let x = 5;
let x = 6;

这和 mut 变量的使用是不同的,第二个 let 生成了完全不同的新变量,两个变量只是恰好拥有同样的名称,涉及一次内存对象的再分配 ,而 mut 声明的变量,可以修改同一个内存地址上的值,并不会发生内存对象的再分配,性能要更好。

其实我并不认为这个是个好特性,变量遮蔽的作用是如果你在某个作用域内无需再使用之前的变量(在被遮蔽后,无法再访问到之前的同名变量),就可以重复的使用变量名字,而不用绞尽脑汁去想更多的名字。我感觉是个很鸡肋的功能

fn main() {
    let x: i32 = 5;
    let x = x+1;
    println!("{}",x);
    {
        let x: i32 = 10;
        println!("{}",x);
    }
    println!("{}",x);
     
}

输出结果为

6
10
6

作用域内的变量和作用域外的变量遮蔽


未使用变量两种声明方式

  1. 前面加下划线:_x
  2. 开头进行声明:#[allow(unused_variables)]
posted @ 2023-03-22 11:35  wenli7363  阅读(138)  评论(0编辑  收藏  举报