我有一个可变引用向量:
type T = String;
let mut mut_vec: Vec<&mut T> = vec![];
我想将它的(副本)传递给采用不可变引用向量的函数:
fn cool_func(mut immut_vec: Vec<&T>) -> bool {false}
我该怎么做?
答案 0 :(得分:2)
您可以取消引用并重新借用可变引用,然后将其添加到新的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>) -> bool {
false
}
但是请注意,这会消耗原始的Vec
-您无法真正绕开它,就像原始的Vec
仍然存在一样,您将具有对同一对象的可变引用和不可变引用数据,编译器将不允许。
答案 1 :(得分:1)
如果您需要进行实际的转换,请参见Joe Clay's answer。但是,您可能不需要首先进行转换!
更改函数而不是更改参数,以使其接受可变和不可变的引用。在这里,我们使用Borrow
对两者进行抽象:
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>,
{
}
另请参阅: