变量

重要知识

  • 变量:variable,不多解释,和所有语言的定义一致
  • 变量绑定:variable bindings,可以先理解为“赋值”,但不完全是这样的
  • 遮蔽:bind shadow
  • 解构:是啥?后面再学习一下

变量命名

参考《Rust 语言圣经》

变量绑定

前面了解到 Rust 用 let 声明变量,let a = 9;,这个过程就叫做”变量绑定“,为什么是绑定,而不是常规理解的赋值,这里先总结这两个原则,跟所有权有关:

  • Rust 中每一个值都有且只有一个所有者(变量)

  • 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)

    这个还要结合所有权再去理解一下

    这里简单理解为:绑定即是主从的关系,一个对象(值),绑定到它的主人(变量),代表着一种权属关系,即变量拥有值的所有权

变量可变性


#![allow(unused)]
fn main() {
fn mutable() {
    let a = 5;
    // a = 6; // 报错:Cannot assign twice to immutable variable [E0384]

    let mut b = 5;
    b - 6;
}

}

通过 mut 声明变量的可变性,显示标记了哪些变量是可变的。

关于显示用 mut 声明变量的可变性,我认为有点设计上的矛盾,或者说不一致,前面可以看到对于类型 Rust 可以自动推导,不用显示声明,这里可变性是需要显示的声明,我的理解“变量的可变性”还是与安全关系紧密相关。

从代码阅读上看,类型推导对阅读和review 不友好,特别是离开 IDE 环境。

变量解构

fn destructure() {
    let (a, mut b): (bool, bool) = (true, false);
    println!("a={},b={}", a, b);
    b = true;
    println!("a={},b={}", a, b);
    assert_eq!(a, b)
}

fn main() {
 destructure();
}

关于解构模式匹配(pattern match)的内容放在后面再学习,看了部分的内容不是很理解.

不可变变量与常量

常量声明使用 const,必需标注类型,不能使用 let;不仅默认是不可变,生命周期内都不允许改变;常量命名是全部大写。


#![allow(unused)]
fn main() {
const MAX_LEVEL: i32 = 4;
}