大家好,我是站长polarisxu。这是Rust退出系列的第3篇教程,探索Rust中的变量。01变量和绑定变量指定了一个存储单元的名称(MemoryLocation),它存储了特定类型的值。Rust是一种静态类型语言,变量类型不能在运行时更改。和大家熟悉的大多数编程语言不同,Rust中的变量一般不叫声明,而是叫绑定(这是从函数式语言借来的,使用关键字let来绑定),那么有什么区别呢?在Go语言中声明变量一般有以下几种方式:varage=10varageintvarageint=10age:=10//只能在函数内部使用//可以分组var(age=10birthday="01-01")来Go中声明变量,可以不指定类型(会进行类型推导),也可以不给初始值(会有默认的初始值)。在Rust中,形式较少,主要有两种:letage=10;租金:i32=10;和Go一样,大多数时候,Rust也可以推导类型。显示指定类型时,需要加上:。关于类型,后续解释。那为什么Rust中的变量创建一般被称为绑定呢?1)Rust和C一样,创建后必须先初始化才能使用(未使用的变量会警告)。以下代码编译报错:fnmain(){letage:i32;println!("ageis{}",age);}//error[E0381]:borrowofpossibly-uninitializedvariable:`age`2)在Rust中,通过letkeyword,在标识符(比如变量age)和值(比如10)之间建立关联。表明所有权关系。也就是说,这段记忆现在属于年龄。熟悉JS的朋友应该对var和let很亲切,但是两者的区别并不等同于Go中的var和Rust中的let的区别。02Variability第一次看到下面的代码错误,你一定特别吃惊:fnmain(){letage=10;println!("ageis{}",age);age=11;println!("ageis{}",age);}//error[E0384]:cannotassigntwicetoimmutablevariable`age`是的,Rust中的变量默认是不可变的(好吧,变量是不可变的......但不是常量)。这也是Rust中内存管理的一个非常重要的特性。如果我希望变量可变怎么办?Rust提供了关键字mut,称为可变绑定:fnmain(){letmutage=10;println!("ageis{}",age);age=11;println!("ageis{}",age);}一般来说,我们应该先创建不可变变量,真正需要的时候才使用可变变量。03Hidden(shadow)由于默认情况下变量是不可变的,所以在Rust中仍然存在这样的“怪异”情况。以下代码工作正常:fnmain(){letage=10;println!("ageis{}",age);letage=11;println!("ageis{}",age);}在Go中,它肯定报告重复声明。这种用于创建具有相同名称的变量的“重复”语法在Rust中称为Shadow。也就是说,上次创建的被本次创建的隐藏了。具体用途是什么?比如像这样的代码在Go中很常见:ageStr:=req.FormValue("age")age,err:=strconv.Atoi(ageStr)也就是同一个值,因为类型不同,所以需要用两个不同名称的变量来表示。但这可以在Rust中完成:fnmain(){letage="10";letage=age.parse::
