如何在使用iter()。filter()。collect()而不是Vec之后获取Vec

问题描述 投票:3回答:1

我有一个字符串向量。我想从这个向量中获得两个子集:带有"zzz"的字符串和带有"bye"的字符串。

每个子集的类型是Vec< && String>。这是对原始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);
}

(Qazxswpoi)

一种方法是使用Playground,但后来我将无法运行第二个过滤器。

也许这只是生锈的方式?由于自动取消引用,我可能只是不在乎这是一个vector.into_iter()...?它会在以后导致问题吗?

vector reference rust iterator
1个回答
7
投票

您可以使用Vec<&& String>克隆每个引用,而不是再次引用它们:

Iterator::cloned

克隆参考文件很便宜,因为它是let v_zzz: Vec<&String> = v_before .iter() .filter(|&element| element.contains("zzz")) .cloned() .collect();


除此之外:通常最好传递implemented by dereferencing而不是&str,因为它更灵活。当我在Rust代码中看到&String时,它突显出可能没有意图或可以改进的东西。

© www.soinside.com 2019 - 2024. All rights reserved.