当前位置: 首页 > 科技观察

Rust劝阻变量

时间:2023-03-11 20:50:10 科技观察

大家好,我是站长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::().unwrap();println!("ageis{}",age);}但是这个语法有优点也有缺点。在涉及范围时,要特别注意隐藏的问题。这很像Go中短声明(:=)的“坑”。类似下面的代码,最后的年龄还是10:(实际代码一般不会那么明显)fnmain(){letage=10;{letage="abc";println!("ageis{}",age);}println!("ageis{}",age);}//ageisabc//ageis10可见,隐藏只会在其范围内生效。04总结Rust是一种静态类型语言,变量类型在运行时不能改变。通过let创建变量,在Rust中一般称为变量绑定;默认变量是不可变的,要创建变量绑定,可以在变量名前添加mut关键字;同名变量的重复定义会隐藏(shadow)之前的变量,但必须注意作用域问题;本节内容比较简单,但要注意与所学语言的差异和可能出现的陷阱。还没被劝退呢~本文转载自微信公众号「polarisxu」,可以通过以下二维码关注。转载本文请联系polarisxu公众号。