Skip to content

Rust 变量

变量定义

  • 变量的定义使用关键字let
  • 变量名使用小写蛇形命名 ( snake_case )
  • 变量定义时可以省略数据类型 ( 编译器可以自动类型推导 )
rs
fn main() {
    let 变量名1: 类型 = 值;  
    let 变量名2 = 值;
}

不可变性

变量默认不可变 ( 不允许值改变否则报错 )

rs
fn main() {
    let 变量 = 值;      
    变量 = 新值;        // 报错: cannot mutate immutable variable
}

隐藏性

Shadowing

Rust 允许在同一个作用域内定义多个同名变量

新变量会隐藏 ( 覆盖 )旧变量

rs
fn main() {
    let x = 1;
    let x = x + 1;
    println!("{}", x);  // 2

    let x = "hello";
    println!("{}", x);  // hello

    let x = x.len();
    println!("{}", x);  // 5
}

隐藏性 vs mut

  • 隐藏性允许新变量的数据类型与旧变量可以不同
rs
fn main() {
    let x: &str = "  ";                
    let mut x: usize = x.len();

    let y: &str = "  ";
    y = y.len();        // 报错: expected `&str`, found `usize`
}

可变变量

若允许值改变则定义变量时需使用关键字mut

rs
fn main() {
    let mut 变量 = 值;  
    变量 = 新值;
}

不频繁更新的变量也可利用 变量隐藏性 来实现覆盖

rs
fn main() {
    let x = 值1;        
    let x = 值2;
}

临时变量

临时变量用于存储不使用的值,可避免变量未使用的编译器报错

约定使用单下划线_命名

rs
fn main() {
    let _ = 值;         
}

静态变量

  • 静态变量的定义使用关键字static
  • 静态变量名使用大写蛇形命名 ( SNAKE_CASE )
  • 静态变量定义时必须指明其数据类型,且值默认不可变
rs
static 静态变量名: 类型 = 值;

静态变量是全局作用域

rs
static HELLO: &str = "Hello, Rust!";

fn main() {
   println!("{}", HELLO);  // Hello, Rust!
}

常量定义

  • 常量定义使用关键字const
  • 常量名使用大写蛇形命名 ( SNAKE_CASE )
  • 常量定义时必须指明其数据类型与值,且值不可改变
  • 常量的值不可以在运行时动态计算,必须是在编译时已知的值
  • 常量可在任何作用域内定义,但是是块级作用域
rs
fn main() {
    const 常量名: 类型 = 值;    
}

作用域

rs
fn main() {
    let a: &str = "aaa";                
    {
        let b: &str = "bbb";
        println!("{}", a);  // aaa
        println!("{}", b);  // bbb
    }
    println!("{}", a);      // aaa
    println!("{}", b);      // 报错: cannot find value `b` in this scope
 }