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

wiz*_*zz4 4 casting rust

我有一个可变引用向量:

struct T;
let mut mut_vec: Vec<&mut T> = vec![];
Run Code Online (Sandbox Code Playgroud)

我如何将它(的副本)传递给一个采用不可变引用向量的函数?

fn cool_func(mut immut_vec: Vec<&T>) {}
Run Code Online (Sandbox Code Playgroud)

Joe*_*lay 5

您可以取消引用并重新借用可变引用,然后将它们添加到新的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>) {}
Run Code Online (Sandbox Code Playgroud)

但是请注意,这会消耗原始数据Vec- 您无法真正解决这个问题,就好像原始数据Vec仍然存在一样,您将同时拥有对同一条数据的可变和不可变引用,这是编译器不允许的。


She*_*ter 2

如果您需要实际转换,请参阅Joe Clay 的回答。但是,您可能一开始就不需要转换!

不要更改参数,而是更改函数,使其接受可变和不可变引用。这里我们使用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>,
{
}
Run Code Online (Sandbox Code Playgroud)

也可以看看: