上一条:没有了! 下一条:Rust 内部可变性(`Internal mutability`)
Rust 引入了一个核心的语义:所有权(Owner),每个对象都有明确的所有权,所有权可以发生两种变化,下面是核心规则:
- 【1】移动(`move`),例如 `let x=String::from("test"); let y =x;`,赋值语句`let y=x;` 将`x`的所有权移动给`y`,则`x`不再可用
- 需要注意的是,并不是赋值语句都发生了所有权的移动
- 内置类型(`built in`) 会执行按位拷贝,例如`let x = 6; let y = x;`
- 实现了`Copy`这个`trait`的类型,会进行深拷贝
- 可以看到在Rust里拷贝不是默认的,为了拷贝需要付出代价,这是根本性的设计和范式差异:
- 实现`trait Copy`,则赋值会自动逐bit拷贝
- 实现`trait Clone`,则可以调用`xx.clone()`获得副本.
- 【2】借用(`borrow`),将对象的所有权临时借给其他对象,借完要还的!借用又分成两种
- 不可变借用(`immutable borrow`):Rust允许一个变量同时有多个不可变借用,例如`let x=String::from("test"); let y = &x; let z=&x;`,则`y`和`z`都是`x`的不可变借用
- 可变借用(`mutable borrow`):Rust只允许一个变量同时有一个可变借用,例如`let x=vec![0;32]; let y=& mut x; let z=&mut x; y.push(0);` 这里`y`和`z`都发生了对`x`的可变借用,编译器会报错
- 请在单线程限定下思考这样设计解决了什么问题?