HelloRust - 4、基本概念

🧑‍🚀跟着《Rust权威指南》学习Rust💪,跟Rust打个招呼吧Hello Rust!🖐️😜
🧑‍✈️同步更新Github/skyline93

✔️一、安装Rust
✔️二、第一个Rust程序
✔️三、使用Cargo
🔞👉四、基本概念

四、基本概念

4.1、变量

4.1.1、不可变性

查看示例项目如下代码:

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

    x = 6;                                  // 2
    println!("The value of x is {}", x);
}

分析:

  1. 变量使用关键字let定义;
  2. 变量默认是不可变的,如上代码编译将报错,如下:
$ cargo check
    Checking variables v0.1.0 (/workspace/hellorust/code/4/variables)
error[E0384]: cannot assign twice to immutable variable `x`
 --> src/main.rs:5:5
  |
2 |     let x = 5;
  |         -
  |         |
  |         first assignment to `x`
  |         help: consider making this binding mutable: `mut x`
...
5 |     x = 6;
  |     ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` due to previous error

💌Tip: 变量被设计成不可变的原因有几个方面的原因:

  • 有时候代码逻辑依赖一个不可变的值,一旦变量值发生变化,往往很难跟踪;尤其修改变量操作仅在某种特定条件下发生时;
  • 当使用一些重型的数据结构,使用可变性修改一个实例可能比赋值和返回一个新的实例效率要高。为什么❓❓赋值和修改的底层是什么区别;
  • 当使用较为轻量的数据结构时,通过创建新变量可能会使代码更加易于理解;

4.1.2、 可变性

上述示例代码修改如下,增加mut关键字使变量具有可变性,即可通过编译:

fn main() {
    let mut x = 5;                              // 变量前增加mut关键字使变量具有可变性
    println!("The value of x is {}", x);

    x = 6;
    println!("The value of x is {}", x);
}

4.1.3、隐藏

如上述代码也可修改为如下,对不可变的变量x再次使用let关键字定义,称作第一个变量x被第二个变量x隐藏了,如下:

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

    let x = 6;                               // 将x隐藏,x的值为6
    println!("The value of x is {}", x);
}

这样对变量执行完一系列操作后,变量x还保持自身的不可变性。但是要注意,重复使用let关键字声明变量虽然变量名不变,得到的确是一个全新的变量,而且通过隐藏,可以改变该变量的类型,如下:

let x = "abc";  // 变量x是字符串类型
let x = 1;       // 变量x变成了数值

而具有可变性的变量是不允许改变数据类型的,如下操作编译将失败:

let mut x = "abc";  // 变量x是字符串类型
x = 1;               // 变量x变成了数值

报错如下:

$ cargo run
   Compiling variables v0.1.0 (/workspace/hellorust/code/4/variables)
error[E0308]: mismatched types
  --> src/main.rs:27:9
   |
26 |     let mut x = "abc";  // 变量x是字符串类型
   |                 ----- expected due to this value
27 |     x = 1;               // 变量x变成了数值
   |         ^ expected `&str`, found integer

For more information about this error, try `rustc --explain E0308`.
error: could not compile `variables` due to previous error

4.2、常量

使用const关键字定义一个常量

const MAX_POINTS: u32 = 100_000

🌈代码风格:

  • 常量通常使用下划线分隔的全大写字母命名,如果是数值类型,数值使用下划线提高可读性;

💌Tip: 常量和不可变变量虽然都无法被其他代码修改,但它们还是存在一些区别:

  • 常量不仅默认不可变,而且总是不可变;
  • 常量的定义使用const关键字定义,而且必须显示指定其数据类型;
  • 常量可以声明在任何作用域中,包括全局作用域;
  • 常量只能在常量表达式中使用,无法将运行时的值绑定到常量上。

posted @ 2022-07-10 12:50  GreeneGe  阅读(25)  评论(0编辑  收藏  举报

https://github.com/Glf9832