rust - 一个数组如何包含对同一对象的多个可变引用?

标签 rust

<分区>

我正在制作一款基于图 block 的游戏,其结构跨越多个图 block 。结构下的每个图 block 都必须具有对该结构的可变引用。对于跨越两个图 block 的结构,表示 map 的二维数组必须同时包含对该结构的两个可变引用。

我还有一个列表,它可变地拥有我所有的结构(用于迭代)

我用 &mut 试过但失败了:

let mut all_structures: Vec<Box<Structure>> = Vec::new();
let mut grid: [[Vec<&mut Box<Structure>>; 4]; 4] = Default::default(); // accessed [y][x]

let mut house: Box<Structure> = Box::new(House { });
grid[1][1].push(&mut house);
grid[1][2].push(&mut house);
all_structures.push(house);

有错误:

error[E0499]: cannot borrow `house` as mutable more than once at a time
  --> src/main.rs:21:21
   |
20 |     grid[1][1].push(&mut house);
   |                     ---------- first mutable borrow occurs here
21 |     grid[1][2].push(&mut house);
   |                ---- ^^^^^^^^^^ second mutable borrow occurs here
   |                |
   |                first borrow later used by call

现在这只是单线程,所以不需要线程安全

我把代码放到playground上了

最佳答案

最简单的选择是使用 Rc<RefCell<Structure>>而不是 Box<Structure> .

Rc<T> 支持类型值的共享所有权 T ,它可以让您拥有多个指向具有自动生命周期管理的同一对象的指针。 Rc<T>不是线程安全的;你可以改为使用 Arc相反,如果你后来发现你需要线程安全。

RefCell<T> 允许您在运行时而不是在编译时执行 Rust 借用规则(也就是说,可以有一个 &mut 借用或任意数量的 & 借用):这意味着可以有多个路径供您使用可能会改变同一个对象,只要您实际上没有这样做。

我在 playground 上放了一个完整的例子.请注意,这使用 .borrow().borrow_mut() ,如果您实际上最终违反了借用规则(例如,通过一次多次可变地借用相同的 Structure),这将引起 panic 。

关于rust - 一个数组如何包含对同一对象的多个可变引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138370/

相关文章:

generics - E0308 具有简单泛型函数的不匹配类型

rust - 将 Bitv 转换为 uint

rust - 是否可以在运行时组合函数链?

rust - 如何永久关闭瓶盖

rust - 元组结构有哪些用例?

rust - 如何使用 kuchiki 只获取 TEXT_NODE

rust - 从现有系列和 map 值创建新系列

使用特征对象时,使用rust 具有特征绑定(bind)的泛型类型

rust - 从 cargo 包的测试目录导入主包 crate

rust - 在 From 实现中 panic 是惯用的吗?