14-组合智能指针
组合智能指针 — Rust 语言之旅
内容来源 · Tour of Rust / Rust 语言之旅
原文链接: https://tourofrust.com/103_zh-cn.html
组合智能指针
智能指针看起来可能会存在一些限制,但是我们可以做一些非常有用的结合。
Rc<Vec<Foo>> - 允许克隆多个可以借用堆上不可变数据结构的相同向量的智能指针。
Rc<RefCell<Foo>> - 允许多个智能指针可变/不可变地借用相同的结构Foo
Arc<Mutex<Foo>> - 允许多个智能指针以 CPU 线程独占方式锁定临时可变/不可变借用的能力。
内存细节:
- 您会注意到一个包含许多这些组合的主题。 使用不可变数据类型(可能由多个智能指针拥有)来修改内部数据。
这在 Rust 中被称为“内部可变性”模式。 这种模式让我们可以在运行时以与 Rust 的编译时检查相同的安全级别来改变内存使用规则。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| use std::cell::RefCell;
use std::rc::Rc;
struct Pie {
slices: u8,
}
impl Pie {
fn eat_slice(&mut self, name: &str) {
println!("{} took a slice!", name);
self.slices -= 1;
}
}
struct SeaCreature {
name: String,
pie: Rc<RefCell<Pie>>,
}
impl SeaCreature {
fn eat(&self) {
// use smart pointer to pie for a mutable borrow
let mut p = self.pie.borrow_mut();
// take a bite!
p.eat_slice(&self.name);
}
}
fn main() {
let pie = Rc::new(RefCell::new(Pie { slices: 8 }));
// ferris and sarah are given clones of smart pointer to pie
let ferris = SeaCreature {
name: String::from("ferris"),
pie: pie.clone(),
};
let sarah = SeaCreature {
name: String::from("sarah"),
pie: pie.clone(),
};
ferris.eat();
sarah.eat();
let p = pie.borrow();
println!("{} slices left", p.slices);
}
|