Lec Note 1
Rust 的深复制没什么好说的,就是 clone()
。
Rust 的 Copy
trait:
- 基本类型
- 纯基本类型组成的 tuple
- &T
: immutable reference
因此,对于不显示加 clone()
的复制:
- 如果是基本类型,所有权就不变
- 如果是不可变引用,那么就是虽然借用了,但是只借用了值,不借用所有权
- 如果是可变引用,那么就是把所有权也借用了
fn main() {
let mut i: i32 = 114514;
let j = &i; // i is borrowed, ownership unchanged
// Error: since i is borrowed, you can't change its value or pass its ownership
// i += 2;
// let l = &mut i;
j;
// Since j will never be used again, j is released and i is given back
let mut k = &mut i; // i is borrowed, ownership passed to k
*k = 1919810;
// Since k will never be used again, k is released and i is given back
println!("i: {}", i);
}
在 s 被借用的时候,不可以
- 改变 s 的值
- 如果 s 被不可变引用,那么就不可以再次被可变借用
- 警告: 只要是
&mut s
,不论左侧是let x =
还是let mut x =
,都属于可变借用。
- 警告: 只要是
- 如果 s 被可变引用,那么就不可以再次被可变/不可变借用
注意: 可变引用没有 Copy Trait,所以会造成所有权转移。但是,不论是可变引用,还是不可变引用,都不能拿走所有权,而只能借用所有权——用完之后,必须要还给人家。因此,下面的代码,是不通过的
struct My {
i: String,
j: u32
}
fn bad_function1(s: &mut My) -> String {
s.i // Error: s 是可变引用,因此只是借用了所有权,不能拿走
}
fn bad_function2(s: &mut My) {
let k = s.i; // Error: s 是可变引用,因此只是借用了所有权,不能拿走
}
fn bad_function3(s: &mut My) {
let k = *s; // Error: s 是可变引用,因此只是借用了所有权,不能拿走
}
fn bad_function4(s: &mut My) {
let k = s.j; // OK, since s.j is of type u32, which has `Copy` trait
}
fn main() {
// ...
}
错误:
error[E0507]: cannot move out of `s.i` which is behind a mutable reference
--> src/main.rs:7:5
|
7 | s.i // Error: s 是可变引用,因此只是借用了所有权,不能拿走
| ^^^ move occurs because `s.i` has type `String`, which does not implement the `Copy` trait
总结
总而言之,rust 的这套机制,就是为了让
- 不可变引用的数据,在其作用域内,一定不变
- 可变引用的数据,在其作用域内,一定独享