我正在寻找一个类似于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"?
如果答案是肯定的,那么还有一个线程安全的变体吗?
RefCell
不是为长期借款而设计的。典型的用例是,在函数中,您将借用RefCell
(可变或不可变),使用该值,然后在返回之前释放借用。我很想知道您希望如何从RefCell
单线程上下文中的借用中恢复。
线程安全的等价物RefCell
是RwLock
. 如果仍然获取不兼容的锁(在任何线程上,包括当前线程),它具有try_read
不会try_write
阻塞或恐慌的功能。与 相反RefCell
,如果锁定 a 失败,稍后重试是有意义的RwLock
,因为另一个线程可能恰好同时锁定了它。
如果您最终总是使用write
or try_write
,而从不read
使用 or try_read
,那么您可能应该使用更简单的方法Mutex
。
归档时间: |
|
查看次数: |
148 次 |
最近记录: |