gpt4 book ai didi

vector - 使用 iter().filter().collect() 而不是 Vec<&string> 后如何获取 Vec<&String>

转载 作者:行者123 更新时间:2023-11-29 07:56:49 25 4
gpt4 key购买 nike

我有一个字符串向量。我想从此向量中获取两个子集:带有 "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);
}

( Playground )

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

也许这就是使用rust 的方式?由于自动取消引用,也许我不应该关心这是一个 Vec<&& String> ?以后会不会出问题?

最佳答案

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

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

克隆引用很便宜,因为它是 implemented by dereferencing .


旁白:通常传递 &str 而不是 &String 更好,因为它更灵活。当我在 Rust 代码中看到 &String 时,它很可能不是预期的,或者可以改进的。

关于vector - 使用 iter().filter().collect() 而不是 Vec<&string> 后如何获取 Vec<&String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com