(不)可变变量绑定

本节简单介绍一下RUST中的变量绑定(也叫声明,之所以叫绑定,是因为...往后看吧)

let绑定变量

直接上代码把:

fn main() {
    // 标准的变脸声明: let variable: type = value;
    let a: i32 = 1;
}

可变变量

在C/C++/Python语言中,我们应该没有见过这种约束,声明的变量不可以修改,我相信对于第一次接触这个概念的你 一定很迷茫,请习惯它;

RUST变量原则之一: 变量默认声明都是不可变的,要求编写代码的人必须明确的指出该变量是可变的才可以修改,

这样做的原因是:任何变量都代表一块内存(stack/heap),这个内存默认权限是可读的,RUST为了保证内存安全,会在 编译阶段对内存访问进行大量检查,而把内存默认声明为不可变,可以大大减少编译器的工作量

fn main() {
    // 标准的变脸声明: let variable: type = value;
    let a: i32 = 1;
    // 尝试修复它
    a = 2;
}

变量屏蔽

作为一名C语言开发者,你是否遇到过一段代码没有合适的变量给你用了?我经常遇到

RUST 的变量屏蔽功能一方面是为了解决其他语言的约束,另一方面是RUST语言自身的开发习惯需要这种能力

fn main() {
    let a: i32 = 1;
    // 原先的变量a此时已经被屏蔽掉(丢弃),现在的变量a是新的变量
    // 变量屏蔽可以重新定义变量的可变性
    let mut a = a;

    // 也可以改变变量类型
    let a: u32 = 10;
}

未初始化变量

RUST变量原则之一: 不可以使用未初始化的变量,如果未使用,则不会破环这个规则

在C语言里面,本身是没有这个约束的,但是其实现在的编译器通过增加 -Wuninitialized 也可以实现这个检查

RUST语言把这个规则作为默认规则,访问未初始化的内存,无论怎么看,都是危险的

fn main() { 
    // 修复它
    let a: i32;
    let b = a;
}

未使用变量

RUST变量建议之一: 未使用变量,会造成编译告警

关于建议和原则: 这是我自己定义的名词,建议不会造成RUST 检查编译出错,但是会产生编译告警;如果原则被破环, 则会产生编译报错

/// 使用注解 会告诉编译器 可以声明未使用变量
#[allow(unused_variables)] 
fn main() { 
    /// 使用下划线声明未变量,不会造成编译告警
    let _a: i32 = 10;
}

变量解构

支持多个变量的解构,该特性可以提高开发效率 写出更加简洁的代码

fn main() {
    // 利用元组实现一次声明和初始化多个变量 
    // 如果是C要实现相同功能 应该怎么做
    let (x,y,z) =  (1 ,2 ,3);
    println!("{} {} {}",x,y,z);
}

支持先定义变量元组,再进行解构

fn main() {
    let (x, y);
    // 允许部分解构
    (x,..) = (3, 4);
    [.., y] = [1, 2];
    // Fill the blank to make the code work
    assert_eq!([x,y], [3,2]);

    // 从这里可以得知,变量也可以作为元组声明
    let (x, y): (i32,i32);
    (x,..) = (3, 4);
    assert_eq!(x, 3);
    println!("Success!");
}