如何将Vec <&mut T>转换为Vec <&T>?

时间:2019-06-25 12:29:49

标签: casting rust

我有一个可变引用向量:

type T = String;
let mut mut_vec: Vec<&mut T> = vec![];

我想将它的(副本)传递给采用不可变引用向量的函数:

fn cool_func(mut immut_vec: Vec<&T>) -> bool {false}

我该怎么做?

2 个答案:

答案 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>,
{
}

另请参阅: