这里的基本问题是你遇到了
Rust's borrowing rules
:
给定对象
T
,只能有以下之一:
-
有几个不变的引用(
&T
)到对象(也称为
混叠
)
-
有一个可变的参照物(
&mut T
)到对象(也称为
易变性
)
你想留个证明人
&Vec
到您的vec(以便您以后可以使用它),同时尝试在一个闭包中添加东西(即
&mut Vec
)铁锈不知道你不会用
&VEC
当关闭正在使用
&穆特VEC
,所以它不允许您创建
&穆特VEC
在结束的时候
&VEC
在封闭的外面闲逛。
你能做的第二件事就是使用
Rc
. 这将允许您回避编译器的借用检查,而将其推迟到运行时。但是:这意味着如果您在程序运行时试图违反借用规则,那么它将恐慌而不是编译时错误!
在大多数情况下,你可以
Rc<Vec<_>>
和正常人一样
Vec
,因为
钢筋混凝土
器具
Deref
.
因为你也希望能够变异
VEC
为了添加内容,您还需要将其放入
RefCell
. 这将在
VEC
,确保您只有一个
&穆特VEC
立即提供,如果您有
&VEC
你不能
&穆特VEC
(同样,如果你试图违反规则,你的程序会恐慌)。你可以使用
.borrow()
和
.borrow_mut()
方法对
重电池
获取对vec的共享和可变引用(还有
try_*
这些方法的变体,如果您可以做一些明智的事情,如果借用是不可能的)。
如果你不使用
重电池
,您将只能获取不可变/共享的引用(
&VEC
)来自
钢筋混凝土
(除非你只有一个
钢筋混凝土
但是你不需要
钢筋混凝土
!)
尝试如下操作:
use std::cell::RefCell;
use std::rc::Rc;
let sink_infos: Rc<RefCell<Vec<StreamInfo>>> = Rc::new(RefCell::new(Vec::new()));
let sink_infos2 = sink_infos.clone(); // Create a new Rc which points to the same data.
let op = introspector.get_sink_input_info_list(move |result| match result {
pulse::callbacks::ListResult::Item(info) => sink_infos2.borrow_mut().push(info.into()),
pulse::callbacks::ListResult::End => {},
pulse::callbacks::ListResult::Error => panic!("Error getting sink input info"),
});