【问题标题】:How to get Vec<&String> after using iter().filter().collect() instead of Vec<&&String>使用 iter().filter().collect() 而不是 Vec<&& String> 后如何获取 Vec<String>
【发布时间】:2019-02-06 11:58:29
【问题描述】:

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

每个子集的类型是Vec&lt; &amp;&amp; String&gt;。这是对原始字符串的引用的引用向量。我怎样才能只得到Vec&lt;&amp; String&gt;

我目前正在处理的代码:

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);
}

(Playground)

一种方法是使用vector.into_iter()...,但我将无法运行第二个过滤器。

也许这就是生锈的方式?由于自动取消引用,也许我不应该关心这是Vec&lt;&amp;&amp; String&gt;?以后会不会出问题?

【问题讨论】:

    标签: vector reference rust iterator


    【解决方案1】:

    您可以使用Iterator::cloned 克隆每个引用而不是再次引用它们:

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

    克隆参考很便宜,因为它是implemented by dereferencing


    除此之外:通常最好传递&amp;str 而不是&amp;String,因为它更灵活。当我在 Rust 代码中看到 &amp;String 时,它可能不是故意的,或者可以改进。

    【讨论】:

    • 谢谢!并考虑将.cloned() 放在.filter() 之后,因为:stackoverflow.com/q/35354716/1073672
    • @user10607 是的!在看到您的评论之前,我刚刚发现并更改了它。虽然,我不确定它在这种情况下是否有太大的不同,因为它只是一个被克隆的指针。
    • @user10607 但也请参阅该问题的second answer,它适用于此处(因为指针很小且Copy
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 2015-05-23
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多