Rust 有没有一种方法可以在不可变地借用早期元素的同时将元素添加到容器中?

Rust 有没有一种方法可以在不可变地借用早期元素的同时将元素添加到容器中?,rust,containers,unsafe,Rust,Containers,Unsafe,我正在构建一个GUI,我想将所有使用过的纹理存储在一个地方,但我必须添加新的纹理,而旧的纹理已经被永久借用 let (cat, mouse, dog) = (42, 360, 420); // example values let mut container = vec![cat, mouse]; // new container let foo = &container[0]; // now container is immutably borrowed container.pu

我正在构建一个GUI,我想将所有使用过的纹理存储在一个地方,但我必须添加新的纹理,而旧的纹理已经被永久借用

let (cat, mouse, dog) = (42, 360, 420); // example values

let mut container = vec![cat, mouse]; // new container

let foo = &container[0]; // now container is immutably borrowed

container.push(dog); // error: mutable borrow
有没有任何现有的结构允许这样的事情,
或者我可以使用原始指针实现类似的功能吗?

最简单的方法是引入共享所有权:

现在
container
foo
共同拥有
cat

有没有任何现有的结构允许这样的事情

是的,但总是有权衡的。上面,我们使用
Rc
来共享所有权,这涉及到一个参考计数器

另一个可能的解决方案是使用竞技场:

extern crate typed_arena;

use typed_arena::Arena;

fn main() {
    let container = Arena::new();
    let cat = container.alloc(42);
    let mouse = container.alloc(360);
    let dog = container.alloc(420);
}
这是不可索引的,您不能再次获得值的所有权,也不能删除值

能够从集合中删除内容总是会使引用无效变得危险

我可以使用原始指针实现类似的东西吗

几乎可以肯定。你能不能把它做好一直是个棘手的问题

但我必须添加新的纹理,而旧的纹理已经被永久借用

很多时候,你不必做这样的事情。例如,您可以将逻辑划分为多个阶段。你有两个容器;一个是人们引用的,另一个是收集新值的。在阶段结束时,将两个集合合并为一个集合。当然,您必须确保在阶段结束后不使用任何引用

extern crate typed_arena;

use typed_arena::Arena;

fn main() {
    let container = Arena::new();
    let cat = container.alloc(42);
    let mouse = container.alloc(360);
    let dog = container.alloc(420);
}