我有一个可变引用的向量:
struct T;
let mut mut_vec: Vec<&mut T> = vec![];
我该如何将它(的一个副本)传递给一个接受不可变引用向量的函数?
fn cool_func(mut immut_vec: Vec<&T>) {}
我有一个可变引用的向量:
struct T;
let mut mut_vec: Vec<&mut T> = vec![];
fn cool_func(mut immut_vec: Vec<&T>) {}
您可以取消引用并重新借用可变引用,然后将它们添加到新的 Vec
中:
fn main() {
let mut st = String::new();
let mut_vec = vec![&mut st];
let immut_vec = mut_vec.into_iter().map(|x| &*x).collect();
cool_func(immut_vec);
}
fn cool_func(_: Vec<&String>) {}
注意,这会消耗原始的Vec
- 你无法绕过这个问题,因为如果原始的Vec
仍然存在,那么您将同时拥有可变和不可变引用相同的数据片段,这是编译器不允许的。
RefCell
、Mutex
等),但它们是最后的选择。 - Joe ClayBorrow
来抽象处理两者:use std::borrow::Borrow;
fn main() {
let mut st = String::new();
let mut_vec = vec![&mut st];
cool_func(mut_vec);
let immut_vec = vec![&st];
cool_func(immut_vec);
}
fn cool_func<S>(_: Vec<S>)
where
S: Borrow<String>,
{
}
另请参阅: