0%

Rust入门

Rust has been voted the “most loved programming language” in the Stack Overflow Developer Survey every year since 2016.

Rust的(非官方)吉祥物:

数据类型、变量、循环、函数啥的就不放了。接下来说点有意思的。

变量默认是不可变的(这句话读起来怪怪的),需要额外声明为可变的才能修改。Rust也有常量,常量和不可变变量的区别是,常量不能被Shadowing.(Rust 允许程序员用同一个变量名重复声明变量。此时,新的变量将覆盖旧的变量。)


Rust和其他语言真正的区别在于:快速地安全。变量超出作用域会自动释放;变量具有唯一的所有权。这里写的比较详细。

所有权规则:

  • Rust 中的每个值都有一个变量,称为其所有者。
  • 一次只能有一个所有者。
  • 当所有者不在程序运行范围时,该值将被删除。

基本数据类型(整数、布尔、浮点、字符)的处理很简单,变量名和内存地址1:1对应,赋值是复制。

对于一般的数据类型,赋值是移动,同时原来的变量名会失效!(非常特殊的一点)

1
2
3
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1); // 错误!s1 已经失效

函数传参相当于一次赋值。

“引用”,类似于指针的存在,相当于租借(borrow)值的所有权。当所有权改变时,租借失效。

1
2
3
4
5
6
7
fn main() {
let s1 = String::from("hello");
let mut s2 = &s1;
let s3 = s2;
s2 = &s3; // 重新从 s3 租借所有权
println!("{}", s2);
}

“引用”默认不能修改值,但是可以事先声明:

1
2
3
4
5
6
7
8
9
10
fn main() {
let mut s1 = String::from("run");
// s1 是可变的

let s2 = &mut s1;
// s2 是可变的引用

s2.push_str("oob");
println!("{}", s2);
}

可变引用不允许多重引用,但不可变引用可以。简单的说就是,每一时刻只有一个变量能修改这片内存。Rust 对可变引用的这种设计主要出于对并发状态下发生数据访问碰撞的考虑,在编译阶段就避免了这种事情的发生。

Rust的错误处理和Null是借助枚举类来实现。

Rust对多线程的支持也挺好的,也有通道(channel)。