所有权
1 2 3 4 5 6 7 8 9 10 11
| fn main() { let a = String::new(); let b = a;
let c = fun1(b); }
fn fun1(mut name: String) -> String { name.push_str("Hello"); return name; }
|
- 变量如果发生转接赋值操作后(主要是处于堆上的内存)就不能再使用。
克隆
1 2 3 4 5 6 7 8 9 10 11 12 13
| fn main() { let a = String::new(); let b = a;
let c = fun1(b);
let d = c.clone(); }
fn fun1(mut name: String) -> String { name.push_str("Hello"); return name; }
|
引用和借用
1 2 3 4 5 6 7 8 9
| fn main() { let a = String::from("Hello"); let b = String::from("world"); fun(& a, & b); }
fn fun(t1: &String, t2: &String) { println!("{t1} {t2}"); }
|
数据不应该同时“被别名引用” 和 “具有可变性”
1 2 3 4 5 6
| fn main() { let mut v: Vec<i32> = vec![1, 2, 3]; let num: &i32 = &v[2]; v.push(4); println!({*num}); }
|
R(读权限)、W(写权限)、O(可释放或移动权限)
1 2 3 4 5
| fn main() { let a = 1; let mut b = 2; let mut c = &a; }
|
当然,这里的权限仅只对于自己来说,而非指向的变量。
简单来说,就是当一个数据被多个变量指向时,不能随意为其做出更改,且同时最多只能有一个变量有修改权限。