gpt4 book ai didi

pointers - 过滤 Vec 时无法移出借用的内容

转载 作者:行者123 更新时间:2023-11-29 08:02:53 25 4
gpt4 key购买 nike

我正在尝试实现一个函数,以返回包含从 ( Vec<String> ) 到另一个 Vec<String> 的模式的所有字符串的向量.

这是我尝试过的:

fn select_lines(pattern: &String, lines: &Vec<String>) -> Vec<String> {
let mut selected_lines: Vec<String> = Vec::new();

for line in *lines {
if line.contains(pattern) {
selected_lines.push(line);
}
}

selected_lines
}

这会导致带有 for 循环的行(在 * 行)出现错误。我是 Rust 的新手(昨天开始学习 Rust!),现在几乎不知道如何解决这个错误。

我可以删除 *该错误消失了,但有关类型不匹配的错误开始达到高潮。我想保持函数的签名完好无损。有办法吗?

最佳答案

问题是您试图将 String 实例的所有权移出您的 lines 参数(这是一个输入参数) ... 将所有权转移到返回值(输出)中。

有几个选项供您选择。

选项 1 - 克隆

对你来说最容易理解的就是克隆这些行:

selected_lines.push(line.clone());

现在您已经克隆了这些行...没有所有权问题。您返回的是向量中String新实例。它们只是您传入的副本。

选项 2 - Lifetimes

另一种选择(避免额外分配)是让编译器知道您不会返回任何悬空的引用:

// introduce a lifetime to let the compiler know what you're
// trying to do. This lifetime basically says "the Strings I'm returning
// in the vector live for at least as long as the Strings coming in
fn select_lines<'a>(pattern: &String, lines: &'a Vec<String>) -> Vec<&'a String> {
let mut selected_lines: Vec<&String> = Vec::new();

for line in lines {
if line.contains(pattern) {
selected_lines.push(line);
}
}

selected_lines
}

这就是解决眼前问题的方法。

另一个旋转

如果我要写这篇文章,我会稍微修改一下。这是它的另一个旋转:

fn select_lines<I>(pattern: I, lines: &[I]) -> Vec<&str>
where
I: AsRef<str>,
{
let mut selected_lines: Vec<&str> = Vec::new();

for line in lines {
if line.as_ref().contains(pattern.as_ref()) {
selected_lines.push(line.as_ref());
}
}

selected_lines
}

您可以将此版本与 String&str、向量或切片一起使用。

let lines = vec!["Hello", "Stack", "overflow"];

let selected = select_lines("over", &lines);

// prints "overflow"
for l in selected {
println!("Line: {}", l);
}

let lines2 = [String::from("Hello"), String::from("Stack"), "overflow".into()];

let selected2 = select_lines(String::from("He"), &lines2);

// prints "Hello"
for l in selected2 {
println!("Line again: {}", l);
}

Here it is running on the playground

关于pointers - 过滤 Vec<String> 时无法移出借用的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49745183/

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