我有的引用计数RefCell
个矢量和想要的(mut
)引用一个Vec
通入RefCell
s转换的功能。这些引用不需要超过函数调用。车削A VEC <RC <RefCell<T> >>成&[&MUT T]
它似乎应该是可能的(只有一个,像&*x.borrow_mut()
是好的)。我试图保持的RefMut
和&mut
中间载体来控制寿命,但我还没有摸索出一个方法来得到它的工作:
use std::cell::{RefCell,RefMut};
use std::vec::Vec;
use std::rc::Rc;
trait SomeTrait {}
struct Wrapper<'a> {
pub r: &'a mut SomeTrait,
}
fn foo(_: &[Wrapper]) {}
fn main() {
let mut v1: Vec<Rc<RefCell<SomeTrait>>> = unimplemented!();
let mut v_rm: Vec<RefMut<_>> = v1.iter_mut().map(|r| r.borrow_mut()).collect();
let mut v_wrapper: Vec<Wrapper> = v_rm.iter_mut().map(|ref mut rm| Wrapper{ r: &mut ***rm }).collect();
foo(&v_wrapper[..]);
}
有明确一生的问题:
rustc 1.11.0 (9b21dcd6a 2016-08-15)
error: borrowed value does not live long enough
--> <anon>:17:60
|>
17 |> let mut v_wrapper: Vec<Wrapper> = v_rm.iter_mut().map(|ref mut rm| Wrapper{ r: &mut ***rm }).collect();
|> ^^^^^^^^^^
note: reference must be valid for the block suffix following statement 2 at 17:107...
--> <anon>:17:108
|>
17 |> let mut v_wrapper: Vec<Wrapper> = v_rm.iter_mut().map(|ref mut rm| Wrapper{ r: &mut ***rm }).collect();
|> ^
note: ...but borrowed value is only valid for the block at 17:71
--> <anon>:17:72
|>
17 |> let mut v_wrapper: Vec<Wrapper> = v_rm.iter_mut().map(|ref mut rm| Wrapper{ r: &mut ***rm }).collect();
|> ^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
我做控制foo
这样可以改变它的API,使事情变得更容易,但它在不同的模块/箱,我真的不希望它需要知道,我把我的SomeTrait
对象在Rc<RefCell<_>>
中。
这很有用,谢谢。我想我可以在函数签名(至少有时候)中得到关于生命期限的规则。描述/记录的Rc>的推断“静态”在哪里? –
我想我已经找到了它:[RFC 599](https://github.com/rust-lang/rfcs/blob/master/text/0599-default-object-bound.md) –
...修正者[RFC 1156](https://github.com/rust-lang/rfcs/blob/master/text/1156-adjust-default-object-bounds.md) –