变量是任何一门编程语言中都有的概念。
在所有编程语言中变量携带的信息有如下:

  • 名称
  • 类型
  • 数值
  • 未确定但唯一的内存指向

    变量的名称

    不论是动态语言还是静态语言,变量的名称都具有唯一的指向性。准确的说变量在确切的时间段是唯一的。因为变量本身指代了运行时的某一段内存,而同一时刻的内存是唯一的。
    在某些时刻。我们会发现同名的名称,这也是程序中容易误解的地方。
    当出现这种情况时,我们往往要发现变量名称的额外信息。比如从属不同对象的一部分,比如作用域的不同。
    最难辨别的变量的重名问题是作用域内的变量重名。常见的有全局变量和局部变量共用一个变量名。在这种情况下,通常是谁后声明,离使用的情况最近,就使用谁。编译器或者是解释器都不会从整个作用域开始解析,这样的开销实在是太大。

    变量的类型与数值

    类型和数值往往是结合在一起的,类型是数值的集合,数值必然是类型中的一个确切指。弱类型和强类型语言的差别主要是是否允许类型之间的隐式装换。弱类型的语言会自动或者不声明的进行类型的转换。强类型语言则只能进行类型转换规则下的转换。
    比如一个数字16。在其他语言中,它可能是一个整数,也可能是一个小数,完全根据上下使用的语境中转换。就跟人在说话时,会根据上下文的语境去理解真实的意识。我们会做一个阴阳人或者是开车。弱类型的语言便能达到类似的效果。
    强类型的语言有着一套适用的规则去进行类型的装换。在rust中便是标准库中的conver模块,这个模块定义了类型转换中的常用信息。

    变量声明

    rust中变量声明分为两类,一种是通过关键字let声明的变量。一种是通过模式匹配match声明的变量。

    let

    let的声明流程如下:

    1. let x: u32 = 3;
    2. println!("x的值是:{}", x);

    第一行中let为关键字,x为变量名,u32为类型,3为值。其中u32的类型标注是可以省略的,但作为强类型的rust,做好良好的类型备注,能极大的提高编码速度。
    第二行为一个打印输出的宏,通过这个宏,可以将数值打印在终端上。

    模式匹配

    模式匹配声明的变量如下:

    1. let may = Some(7);
    2. match may {
    3. None => {
    4. println!("may 是空值");
    5. },
    6. Some(n) => {
    7. println!("may 是: {}", n);
    8. }
    9. }

    运行之后,可以看到n的值为7。这里通过match在第六行声明了一个变量。注意这个变量没有用let声明。而是通过match语法所声明的。

    变量遮蔽

    注意,将上述代码合并成如下形式。

    1. let x: u32 = 3;
    2. println!("x的值是:{}", x);
    3. let may = Some(7);
    4. match may {
    5. None => {
    6. println!("may 是空值");
    7. },
    8. Some(x) => {
    9. println!("may 是: {}", x);
    10. }
    11. }
    12. println!("x 是: {}", x);

    可以看到,名称为x的变量在第一行、第10行、第13行都出现了,但其实x的含义是不同。在第10行中的x是模式匹配到的值是7,其他情况则是3,并且在第10行,我们是访问不到作为3的x,此时x已经被隐藏了。

    变量的可变性

    rust的变量通常是不可变的,你无法修改它,除非你显式的在变量前面用mut修饰。