Rc<T>2025年3月17日 | 阅读 3 分钟
使用 Rc<T> 共享数据让我们创建两个列表,它们共享第三个列表的所有权。 ![]() 在上图中,b 和 c 是两个列表,它们共享第三个列表 a 的所有权。 让我们使用 Box<T> 类型实现上述场景。 输出 ![]() 在上面的例子中,cons 变体由类型为 i32 的数据和指向一个列表的 Box<T> 组成。我们创建了列表 'b','a' 的所有权被移动到 'b' 列表。然后,我们尝试将 'a' 列表移动到 'c' 列表,但是 'a' 列表不能被移动,因为 'a' 列表已经被移动到 'b' 列表。 如何解决这个问题我们可以通过更改 cons 变体的定义来解决这个问题。现在,cons 变体由它们所持有的数据和指向 List 的 Rc<T> 组成。 让我们看一个简单的例子 在上面的例子中,我们需要添加 use 语句以将 Rc<T> 引入作用域。我们不会取得 a 的所有权,而是克隆 a 持有的 Rc<T> 列表,从而将引用数量从 1 增加到 2,因为现在 a 和 b 共享该 Rc<List> 中数据的所有权。当我们创建 c List 时,我们将再次克隆 Rc<List>,从而将引用增加到 3。 克隆一个 Rc<T> 会增加引用计数现在,我们将看到当列表超出作用域时,Rc<T> 如何增加或减少引用计数。 让我们看一个简单的例子 输出 Reference count after creating a List : 1 Reference count after creating b List : 2 Reference count after creating c List : 3 Reference count when c goes out of the scope : 2 在上面的例子中,我们通过调用 Rc::strong_count 函数来打印引用计数。在 Rc<List> 中,a 的初始引用计数为 1,当我们调用 clone 时,引用计数增加 1。如果变量超出作用域,则引用计数减少 1。因此,我们可以说,Drop trait 在 Rc<T>/ 值超出作用域时会自动减少引用计数。 下一个主题Rust RefCell(T) |
我们请求您订阅我们的新闻通讯以获取最新更新。