Rust 语言变量的使用

要点:

  • Rust 运行环境介绍
  • Rust 变量类型声明
  • Rust 可变类型
  • Rust 常量

Rust 运行环境

学习一门新的语言建议从在线编程环境入手,因为这样可以快速上手,熟悉语法要素,而不必纠结开发环境。Rust 语言官方编程环境:https://play.rust-lang.org/。

不过在线编程也有缺点:无法自动补全、自动缩进、格式化代码、无法处理多个源文件。Rust 语言安装也是非常简便:https://www.rust-lang.org/tools/install。

建议B站找个视频,一下子就学会了。

Rust 变量基本用法

Rust 语言变量的基本使用如下:

fn main() {
    let an_integer = 1u32;
    let a_boolean = true;
    let unit = ();

    println!("An integer: {:?}", an_integer);
    println!("A boolean: {:?}", a_boolean);
    println!("Meet the unit value: {:?}", unit);
}

从上面的例子可以看出 Rust 语言使用 let 关键字声明变量,不过 Rust 语言更喜欢把变量的声明过程称为绑定。

💡 在 println! 中使用 {:?} 打印调试信息。

Rust 变量类型声明

上面的展示的例子没有写出变量的类型,其实我们用到了 Rust 语言的类型推导功能,它可以从变量的值反推变量的类型。

fn main(){
    let an_integer: u32 = 1u32;
    let a_boolean: bool = true;
    let unit: () = ();
    let numbers: Vec<i32>= vec![1,2,3,4];

    println!("An integer: {:?}", an_integer);
    println!("A boolean: {:?}", a_boolean);
    println!("Meet the unit value: {:?}", unit);
    println!("Numbers: {:?}", numbers);
}

这个例子演示了如何给变量添加类型,并且给出了 Rust 一种常见容器 Vec 的用法,<i32> 是泛型绑定,可以这么理解:Vec 容器可以装不同类型的数据,例如:整数、浮点数、结构体、元组,这里我们需要装 i32 的整数,因此指定为 <i32>

Rust 可变类型

对于上述代码,我们做出如下一点改动:

fn main(){
    let an_integer: u32 = 1u32;

    an_integer += 1;
    println!("An integer: {:?}", an_integer);
}

编译就会报错:

2 |     let an_integer: u32 = 1u32;
  |         ----------
  |         |
  |         first assignment to `an_integer`
  |         help: consider making this binding mutable: `mut an_integer`
3 |     
4 |     an_integer +=1;
  |     ^^^^^^^^^^^^^^ cannot assign twice to immutable variable

编译器告诉我们需要把 an_integer 绑定为可变的 mut an_integer。修改为:

fn main(){
    let mut an_integer: u32 = 1u32;

    an_integer += 1;
    println!("An integer: {:?}", an_integer);
}

💡 理解变量赋值。

编程语言的赋值符号 = 一般有两层含义:

(1)读取等号右边的值;

(2)把右边的值写到左边变量绑定的内存里。

这样简单的一读一写其实是细思极恐的问题,在并发条件下会造成数据竞争,可能得到多种结果。Rust 这样设计的目的是能不变的数据尽量绑定为不可变。

重新绑定

一个变量名可以被多次绑定:

fn main() {
    let x = 5;
    println!("The value of x is: {}", x);

        let x = "Hello";
    println!("The value of x is: {}", x);
}

后面的绑定会遮盖(shadow)前面的绑定,类型与值都可以重新绑定。

常量

// Globals are declared outside all other scopes.
static LANGUAGE: &str = "Rust";
const THRESHOLD: i32 = 10;

fn is_big(n: i32) -> bool {
    // Access constant in some function
    n > THRESHOLD
}

fn main() {
    let n = 16;

    // Access constant in the main thread
    println!("This is {}", LANGUAGE);
    println!("The threshold is {}", THRESHOLD);
    println!("{} is {}", n, if is_big(n) { "big" } else { "small" });

    // Error! Cannot modify a `const`.
    THRESHOLD = 5;
    // FIXME ^ Comment out this line
}

conststatic 都有贯穿于整个程序的生命周期,他们的区别是:

  • const 没有固定的内存地址,实际上它们会被内联到用到它们的地方,为此对同一常量的引用并不能保证引用到相同的内存地址。
  • static 在使用时并不内联,这意味着对每一个值只有一个实例,并且位于内存中的固定位置,是全局性的。
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!