Rust学习笔记

Rust 从入门到放弃之路!

所有权

变量间转移

1
2
3
4
let s1 = String::from("hello");
let s2 = s1;// s1 的值移动到 s2
// ... 所以 s2 到这里不再有效
println!("{}, world!", s1); // 此处s1已经没有"hello"的所有权

当 s1 赋予 s2 后,Rust 认为 s1 不再有效,因此也无需在 s1 离开作用域后 drop 任何东西,这就是把所有权从 s1 转移给了 s2,s1 在被赋予 s2 后就马上失效了。

由于 Rust 禁止你使用无效的引用,你会看到以下的错误:

1
2
3
4
5
6
7
8
9
10
11
error[E0382]: use of moved value: `s1`
--> src/main.rs:5:28
|
3 | let s2 = s1;
| -- value moved here
4 |
5 | println!("{}, world!", s1);
| ^^ value used here after move
|
= note: move occurs because `s1` has type `std::string::String`, which does
not implement the `Copy` trait

函数传值转移

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = String::from("hello"); // s 进入作用域
takes_ownership(s); // s 的值移动到函数里 ...
// ... 所以到这里不再有效
println!("{}", s);
}

fn takes_ownership(x: String) {
println!("{}", x);
}
1
2
3
4
5
6
7
8
9
10
  |
2 | let s = String::from("hello"); // s 进入作用域
| - move occurs because `s` has type `String`, which does not implement the `Copy` trait
3 | takes_ownership(s); // s 的值移动到函数里 ...
| - value moved here
4 | // ... 所以到这里不再有效
5 | println!("{}", s);
| ^ value borrowed here after move
|
= note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)

引用

由于默认的所有权转移存在,当我们仅需要只读变量,并不想将所有权转移时,就需要引用。

语法:&s

1
2
3
4
5
6
7
8
9
10
fn main() {
let s = String::from("hello"); // s 进入作用域
takes_ownership(&s); // &s表示在takes_ownership中只读,并不会修改他的值
// 所以到这里不再有效
println!("{}", s);
}

fn takes_ownership(x: &String) {
println!("{}", x);
}

可变引用

引用的作用域 s 从创建开始,一直持续到它最后一次使用的地方

变量的作用域从创建持续到某一个花括号 }

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let mut s = String::from("hello");

let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2);
// 新编译器中,r1,r2作用域在这里结束

let r3 = &mut s;
println!("{}", r3);
} // 新编译器中,r3作用域在这里结束
Author

David Lv

Posted on

2022-04-15

Updated on

2022-04-17

Licensed under