Как конвертировать Vec <& mut T> в Vec <& T>? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть вектор изменяемых ссылок:

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

Я хочу передать (копию) его в функцию, которая принимает вектор неизменяемых ссылок:

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

Как я могу это сделать?

1 Ответ

2 голосов
/ 25 июня 2019

Вы можете разыменовать и заново заимствовать изменяемые ссылки, а затем добавить их в новый 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 еще существовал, у вас были бы как изменяемые, так и неизменные ссылки на один и тот же фрагмент данных, что компилятор не допустит.

...