一般来说,对于语言特性最全面的描述通常来自官方文档,比如:https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html
这里面向中文用户,强调一下ownership和reference的法则。交互请添加QQ群:418474680
Ownership:
- Each value in Rust has a variable that’s called its owner. 每个值都有一个称为“所有者”的变量。
- There can only be one owner at a time. 在一个时刻,只能有一个“所有者”。言下之意,可以有不同的所有者轮流持有。
- When the owner goes out of scope, the value will be dropped. “所有者”变量走出Scope,对应的值也同时消失。
对于第一条,值由变量持有,但不是没有个变量都持有值,有的变量持有的是引用,持有引用的变量的消失不会引起值的消失。
let v = [1, 2, 3];
{
let _vv = &v;
assert_eq!(_vv.len(), 3);
// _vv走出Scope不会导致v持有的值的消失。
}
对于第二条,如何解释Rc?也是被一个变量a持有。
enum List {
Cons(i32, Rc<List>),
Nil,
}
use List::{Cons, Nil};
use std::rc::Rc;
fn main() {
let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
let b = Cons(3, Rc::clone(&a));
let c = Cons(4, Rc::clone(&a));
}
Reference:
- At any given time, you can have either one mutable reference or any number of immutable references. 在任何时刻,可以借出任意数量的只读引用,但只能由一个可写引用。
- References must always be valid. 引用必须是可用的。就是在该引用存在的周期内,被引用对象必须是可用的。
如果借出多个可写引用,编译器会报错。下图中的v。
在closure环境下,借用关系会变得看起来很复杂,但是借助编译器的帮助,牢记这些法则,总归能够理出头绪。同时,不管对象看起来如何复杂,最终都会归结到String和Bytes,所有的对象都是可手工Copy的,记住这一点你会在Rust编程的路上走得更远。