Rust 学习笔记 1

世界,你好

1
2
3
4
5
6
7
8
9
10
11
12
13
fn greet_world() {
let southern_germany = "Grüß Gott";
let chinese = "世界,你好";
let english = "World, hello";
let regions = [southern_germany, chinese, english];
for region in regions.iter() {
println!("{}", &region);
}
}

fn main() {
greet_world();
}

这是一个多国语言版的 world hello,至于为什么不是 hello world,详情参见Rust 语言圣经

有其他语言基础的朋友应该很容易就能看懂这份代码,fn 用于声明函数,let 用于声明变量,{} 是占位符(可以自动识别类型)。

Rust 的集合类型不能直接循环,需要转换成迭代器(这里是通过 .iter() 方法),才能用于迭代循环。

在 2021 edition 及以后,支持直接写 for region in regions,因为 for 隐式地将 regions 转换成了迭代器。

变量绑定与解构

变量的绑定

1
let x = 6;

这里我们为变量 x 绑定了一个值,Rust 的变量默认是不可更改的(immutable),想要创建可以更改的变量则需要在绑定时加上 mut 关键字:

1
let mut x = 6;

不可变的变量会带来更好的安全性,而可变的变量则会带来更好的性能与灵活性。

变量的不可变性应该会让人联想到常量,不过这里的变量与常量有些许的不同:

  • 常量不允许使用 mut。常量不仅默认不可变,而且始终不可变。
  • 常量使用 const 关键字,而不是 let,并且常量的值和类型必须标注。

常量的声明:

1
const MAX_POINTS: u32 = 100_000;

使用下划线开头忽略未使用的变量:

1
let _x = 6;

如果我们绑定了变量而未使用,通常情况下 Rust 会给我们警告(warning),但是如果变量名以 _ 开头就不会出现警告。

变量的解构

1
2
3
4
5
6
7
8
fn main() {
let (a, mut b): (bool,bool) = (true, false);
// a = true,不可变; b = false,可变
println!("a = {:?}, b = {:?}", a, b);

b = true;
assert_eq!(a, b);
}

这里的 (a, mut b) 就被解构成了 amut b 两个变量。不光绑定的时候可以解构,赋值的时候也可以结构:

1
2
3
4
5
6
7
8
9
fn main() {
let (a, mut b);
(a, b) = (true, false);
// a = true,不可变; b = false,可变
println!("a = {:?}, b = {:?}", a, b);

b = true;
assert_eq!(a, b);
}

这份代码的输出与上面的代码是一样的。

变量遮蔽

1
2
3
4
5
6
fn main() {
let x = 5;
let x = x + 1;
// x = 5 + 1 = 6
println!("x = {}", x);
}

Rust 允许我们声明多个相同名字的变量,但是只有最后一个同名变量可以使用,这与可变变量不同,可变变量只能修改为相同类型的值,而变量覆盖就是开了一个新的变量,允许我们给这个同名的新变量完全不同的类型和值。