是否有一个更友好的RefCell类对象?

Jac*_*per 5 vector rust

我正在寻找一个类似于Vec<RefCell<T>>它的类,因为它是所有数据的最终所有者和分配器,但是阵列的不同部分可以被多方无限期地可变地借用.

无限期地强调,因为当然Vec<T>也可以由多方共同借用,但这样做涉及进行分割,只有在各方借款后才能解决.

Vec<RefCell<T>>似乎是一个充满危险的世界和许多丑陋的if陈述检查borrow_state,这似乎是不稳定的.如果你做错了什么,那么kablammo!恐慌!这不是借阅图书馆的样子.在借阅图书馆,如果你要求一本不存在的书,他们会告诉你"哦,它已经签出了." 爆炸中没有人死亡.

所以我想编写这样的代码:

let mut a = LendingLibrary::new();
a.push(Foo{x:10});
a.push(Foo{x:11});
let b1 = a.get(0); // <-- b1 is an Option<RefMut<Foo>>
let b2 = a.get(1); // <-- b2 is an Option<RefMut<Foo>>

// the 0th element has already been borrowed, so...
let b3 = a.get(0); // <-- b3 is Option::None 
Run Code Online (Sandbox Code Playgroud)

这样的事情存在吗?或者是否有另一种规范方式来获得这种行为?一种"友好的RefCell"?

如果答案是肯定的,那么还有一个线程安全的变体吗?

Fra*_*gné 2

RefCell不是为长期借款而设计的。典型的用例是,在函数中,您将借用RefCell(可变或不可变),使用该值,然后在返回之前释放借用。我很想知道您希望如何从RefCell单线程上下文中的借用中恢复。

线程安全的等价物RefCellRwLock. 如果仍然获取不兼容的锁(在任何线程上,包括当前线程),它具有try_read不会try_write阻塞或恐慌的功能。与 相反RefCell,如果锁定 a 失败,稍后重试是有意义的RwLock,因为另一个线程可能恰好同时锁定了它。

如果您最终总是使用writeor try_write,而从不read使用 or try_read,那么您可能应该使用更简单的方法Mutex