首页 > 其他分享 >RUST基础:变量遮蔽

RUST基础:变量遮蔽

时间:2022-08-14 12:11:16浏览次数:47  
标签:变量 关键字 push let 遮蔽 println RUST

Rust基础入门书籍推荐《深入浅出RUST》

Rust 是允许在同一个代码块中声明同样名字的变量。如果这样做,后面声明的变量会将前面声明的变量“遮蔽(Shadowing)”起来。如:

1 fn main() {
2     let x = "hello";
3     println!("x is {}",x);
4 
5     let x = 5;
6     println!("new x is {} ",x)
7 }

 

 

输出结果为:

 

 

 我们可以看到上面的程序是可以编译通过并顺利打印出结果的。请注意第5行的代码,它不是x=5;,他前面有一个let关键字。如果没有let这个关键字。这条语句就是对x的重新绑定(重新赋值)。而有了这个let关键字,就是又声明一个新的变量,只是它的名字恰巧与前面的一个变量相同而已。

没有let关键字的声明x的情况下:

 

 

会报如此的错误

 

 虽然两个变量名都是x,但是它们内存空间完全不同,类型也完全不同,因为它们实际上是两个不同的变量。从第5行开始,一直到这个代码块结束,我们没有任何办法再去访问前一个x变量,因为它的名字已经被遮蔽了。

 

 

变量遮蔽在某些情况下是非常有用的,比如,我们需要在同一个函数内部把一个变量转换为另一个变量类型,但又不想给它们起不同的名字,再比如,在同一个函数内部,需要修改一个变量绑定的可变性。例如,我们对一个可变数组执行初始化,希望此时它是可读写的,但是初始化完成后,我们希望它只是只读的。可以这样做:

 1 fn main() {
 2     let mut v = Vec::new(); //v 必须是mut修饰,因为我们需要对它写入数据
 3     v.push(1);
 4     v.push(2);
 5     v.push(3);
 6 
 7     let v = v; //从这里往下,v变成了只读变量,可读写变量v已经被遮蔽,无法在访问
 8     for i in &v{
 9         println!("{}",i)
10     }
11 
12 }

同理,反过来,如果一个变量是不可变的,我们也可以通过变量遮蔽创建一个新的、可变的同名变量:

1 fn main() {
2     let v = Vec::new();
3     let mut v = v;
4     v.push(1);
5     println!("{:?}",v)
6 }

 

标签:变量,关键字,push,let,遮蔽,println,RUST
From: https://www.cnblogs.com/hdhx-lh/p/16585133.html

相关文章

  • react+rust+webAssembly(wasm)示例
    前言:WebAssembly(简称wasm)已经出来有几年了,在一些需要高性能的web应用场景中,wasm技术可以让代码执行效率大大提升。react做为目前大厂主流的前端框架之一,搭配上最近几年一......
  • c语言中形参、变量、实参同名的问题
     001、在函数定义中,形参名不能和函数内部的变量同名,否则会发生冲突。 002、定义不同函数时,可以使用不能的形参名,因为虽然同名,但是分别属于不同的函数。 003......
  • Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法
    python的面向对象面向对象与面向过程面向过程面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做)......
  • cpp-变量
    目录1.枚举类型枚举的定义对枚举类型的操作2.数组数组的定义一维数组的定义初始化表字符串数组字符串数组的初始化二维数组二维数组的定义二维数组的使用3.结构类型结构类......
  • 2.4常量与变量
    /*常量与变量*/#include<stdio.h>//引用头文件#definePI3//PI就是符号常量intmain()//main是标识符{inta=3;/*a就是一个变量,变量名和标识符的命名规......