Как получить Vec <& String> после использования iter (). Filter (). Collect () вместо Vec <&& String> - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть вектор строк.Я хочу получить два подмножества из этого вектора: строки с "zzz" и строки с "bye".

Тип каждого подмножества Vec< && String>.Который является вектором ссылок на ссылку на оригинальную строку.Как я могу получить только Vec<& String>?

Код, над которым я сейчас работаю:

use std::string::String;
use std::vec::Vec;

fn main() {
    let a1 = String::from("hi");
    let a2 = String::from("bye");
    let a3 = String::from("zzz");

    let v_before: Vec<&String> = vec![&a1, &a2, &a3];

    // ref_a is a copy of v_before[0]
    let ref_zzz_a: &String = v_before[2];
    let ref_zzz_b: &String = v_before[2];

    println!("before: {:?}", v_before);

    // QUESTION: why can not this also be Vec<& String> ?
    // v_zzz is just like making  vec![ref_zzz_a, ref_zzz_b]
    let v_zzz: Vec<&&String> = v_before
        .iter()
        .filter(|&&element| element.contains("zzz"))
        .collect();

    let v_bye: Vec<&&String> = v_before
        .iter()
        .filter(|&&element| element.contains("bye"))
        .collect();

    let hand_made: Vec<&String> = vec![ref_zzz_a, ref_zzz_b];

    println!("v_zzz: {:?}", v_zzz);
    println!("v_bye: {:?}", v_bye);
    println!("hand_made: {:?}", hand_made);
}

( Детская площадка )

Один из способов был быиспользовать vector.into_iter()..., но тогда я не смог бы запустить второй фильтр.

Кроме того, может быть, именно такова ржавчина?Из-за автоматического разыменования может мне просто наплевать, что это Vec<&& String>?Не приведет ли это к проблемам позже?

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете использовать Iterator::cloned для клонирования каждой ссылки вместо повторной ссылки на них:

let v_zzz: Vec<&String> = v_before
    .iter()
    .filter(|&element| element.contains("zzz"))
    .cloned()
    .collect();

Клонирование ссылки дешево, поскольку реализовано с помощью разыменования .


В сторону: обычно лучше обойти &str вместо &String, так как он более гибкий.Когда я вижу &String в коде Rust, он выделяется как нечто, что, вероятно, не предназначено или может быть улучшено.

...