变量是任何一门编程语言中都有的概念。
在所有编程语言中变量携带的信息有如下:
- 名称
- 类型
- 数值
-
变量的名称
不论是动态语言还是静态语言,变量的名称都具有唯一的指向性。准确的说变量在确切的时间段是唯一的。因为变量本身指代了运行时的某一段内存,而同一时刻的内存是唯一的。
在某些时刻。我们会发现同名的名称,这也是程序中容易误解的地方。
当出现这种情况时,我们往往要发现变量名称的额外信息。比如从属不同对象的一部分,比如作用域的不同。
最难辨别的变量的重名问题是作用域内的变量重名。常见的有全局变量和局部变量共用一个变量名。在这种情况下,通常是谁后声明,离使用的情况最近,就使用谁。编译器或者是解释器都不会从整个作用域开始解析,这样的开销实在是太大。变量的类型与数值
类型和数值往往是结合在一起的,类型是数值的集合,数值必然是类型中的一个确切指。弱类型和强类型语言的差别主要是是否允许类型之间的隐式装换。弱类型的语言会自动或者不声明的进行类型的转换。强类型语言则只能进行类型转换规则下的转换。
比如一个数字16。在其他语言中,它可能是一个整数,也可能是一个小数,完全根据上下使用的语境中转换。就跟人在说话时,会根据上下文的语境去理解真实的意识。我们会做一个阴阳人或者是开车。弱类型的语言便能达到类似的效果。
强类型的语言有着一套适用的规则去进行类型的装换。在rust中便是标准库中的conver模块,这个模块定义了类型转换中的常用信息。变量声明
rust中变量声明分为两类,一种是通过关键字let声明的变量。一种是通过模式匹配match声明的变量。
let
let的声明流程如下:
let x: u32 = 3;
println!("x的值是:{}", x);
第一行中let为关键字,x为变量名,u32为类型,3为值。其中u32的类型标注是可以省略的,但作为强类型的rust,做好良好的类型备注,能极大的提高编码速度。
第二行为一个打印输出的宏,通过这个宏,可以将数值打印在终端上。模式匹配
模式匹配声明的变量如下:
let may = Some(7);
match may {
None => {
println!("may 是空值");
},
Some(n) => {
println!("may 是: {}", n);
}
}
运行之后,可以看到n的值为7。这里通过match在第六行声明了一个变量。注意这个变量没有用let声明。而是通过match语法所声明的。
变量遮蔽
注意,将上述代码合并成如下形式。
let x: u32 = 3;
println!("x的值是:{}", x);
let may = Some(7);
match may {
None => {
println!("may 是空值");
},
Some(x) => {
println!("may 是: {}", x);
}
}
println!("x 是: {}", x);
可以看到,名称为x的变量在第一行、第10行、第13行都出现了,但其实x的含义是不同。在第10行中的x是模式匹配到的值是7,其他情况则是3,并且在第10行,我们是访问不到作为3的x,此时x已经被隐藏了。
变量的可变性
rust的变量通常是不可变的,你无法修改它,除非你显式的在变量前面用mut修饰。