gpt4 book ai didi

vector - 有没有更友好的类似 RefCell 的对象?

转载 作者:行者123 更新时间:2023-11-29 07:51:26 27 4
gpt4 key购买 nike

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

我强调 无限期 因为当然是 Vec<T> 的碎片也可以由多方可变地借用,但这样做涉及进行拆分,只有在各方完成借用后才能解决。

Vec<RefCell<T>>似乎是一个充满危险和许多丑陋的世界if报表检查 borrow_state , 这似乎是 unstable .如果你做错了什么,那么 kablammo! panic !这不是借阅图书馆的样子。在借阅图书馆,如果你要借一本不在的书,他们会告诉你“哦,已经借完了”。没有人死于爆炸。

所以我想写这样的代码:

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 函数,如果仍然获取不兼容的锁(在任何线程上,包括当前线程),它们不会阻塞或 panic 。与 RefCell 相反,如果锁定 RwLock 失败,稍后重试是有意义的,因为另一个线程可能恰好同时锁定了它。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com