Wang's blog

一、变量与常量

Published on

变量

变量绑定

使用let语句将字面值或另一变量绑定至一个变量。Rust是静态类型语言,每个变量的类型在编译期就已经确定,变量类型可以手动指定也可由编译器推断。

// 将字面值绑定至变量
let an_integer = 1u32;

// 将另一变量绑定至此变量
let copied_integer = an_integer;

可变性

基本上所有的语言中,变量默认都是可变的。但是在Rust中,为了达到最大的安全性,变量默认为不可变的,如需使用可变变量,需要使用mut显示声明。

// 声明不可变变量
let immutable_binding = 1;
// 错误,不可修改不可变变量
immutable_binding += 1

// 声明可变变量
let mut mutable_binding = 1;
// 修改可变变量
mutable_binding += 1;

作用域

每个变量有其作用域,它被限制为只在其所在代码块中有效。

fn main() {
    // 此变量在整个main函数内有效
    let long_lived_binding = 1;
    // 此代码块的作用域小于main函数
    {
        // 此变量只在当前代码块中有效
        let short_lived_binding = 2;
        // 正确
        println!("inner short: {}", short_lived_binding);
    }
    // 代码块结束

    // 错误,超出作用域,无法使用此变量
    println!("outer short: {}", short_lived_binding);
    // 正确
    println!("outer long: {}", long_lived_binding);
}

重影

Rust中的变量可以重名,后定义的变量在其作用域中会隐藏先定义的同名变量(被隐藏的变量只是无法访问,但是仍然存在)。

fn main() {
    // 定义了一个变量
    let shadowed_binding = 1;
    {
        // 可以访问此变量
        println!("before being shadowed: {}", shadowed_binding);
        // 定义了同名变量,在当前块中,隐藏了前一个变量
        let shadowed_binding = "abc";
        println!("shadowed in inner block: {}", shadowed_binding);
    }
    // 超出作用域,取消重影
    println!("outside inner block: {}", shadowed_binding);
    // 定义了同名变量,隐藏了前一个变量
    let shadowed_binding = 2;
    println!("shadowed in outer block: {}", shadowed_binding);
}

常量

常量使用const进行声明,且必须指定类型。常量与不可变变量类似,但是有以下不同之处:

  1. 常量不能使用mut修饰
  2. 常量可以声明在任何作用域,包括全局作用域
  3. 常量必须被赋予一个常量表达式,其值必须在编译期间确定
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

静态变量

静态变量是具有静态生命周期(‘static)的变量,类似其它语言的全局变量。与普通变量类似,它默认是只读的,如果需要修改,要使用mut修饰。但是由于多线程安全问题,修改静态变量的代码是不安全(unsafe)的。

字面值

可以直接在代码中使用字面值。

1                   // 整数
1.2                 // 浮点数
'a'                 // 字符
"abc"               // 字符串
true                // 布尔
()                  // unit类型

0x1a                // 16进制整数
0o12                // 8进制整数
0b11                // 2进制整数

100_000             // 数值中使用下划线增强可读性,值与无下划线相同
1.3e-4              // 科学计数法

100i128             // 指定数据类型