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

我之所以无限期地强调,是因为Vec<T>的片段也可以由多方可变地借用,但是这样做涉及拆分,只有在各方完成借用后才能解决。
Vec<RefCell<T>>似乎是一个危险的世界,许多丑陋的if语句正在检查borrow_state,这似乎是unstable。如果您做错了,那就kablammo! panic !这不是借阅库的样子。在借阅图书馆中,如果您要的书不在那儿,他们会告诉您“哦,这本书已经 checkout 了”。没有人死于爆炸。

所以我想写这样的代码:

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

这样的事情存在吗?还是有另一种规范的方式来获得这种行为?一种“友好的RefCell”?

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

最佳答案

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

等效于RefCell的线程安全为 RwLock 。它具有try_readtry_write函数,如果仍然获得不兼容的锁(在任何线程上,包括当前线程),它们也不会阻塞或引起困惑。与RefCell相反,如果锁定RwLock失败,则稍后重试是有意义的,因为另一个线程可能恰巧同时锁定了它。

如果最终总是使用writetry_write,而不是readtry_read,那么您可能应该使用更简单的 Mutex

关于vector - 是否有一个更友好的类似RefCell的对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33373239/

10-12 16:35