gpt4 book ai didi

rust - 如何避免 filter_map() 在 Rust 中给出错误 "returns a value referencing data owned by the current function"?

转载 作者:行者123 更新时间:2023-12-03 11:28:31 26 4
gpt4 key购买 nike

我正在尝试使用 filter_map 做一些练习。下面的函数创建一个 BufRead,然后选择与正则表达式匹配的行。我希望输出为 "aaa",但编译器给我错误:

returns a value referencing data owned by the current function" at line 7 `reg.captures(ss)`.

我知道我不能返回引用函数拥有的数据的值。但是我不知道如何在这里避免它。当 line 的类型是 &str 时,它起作用。但是在这里,line 的类型是 std::string::String

你能给我一些提示或指导我一些文件吗?我已经阅读了一些文档,但还没有理解如何避免该错误。

use regex::Regex; // 1.4.1
use std::io::{self, BufRead as _};

fn main() {
let reg = Regex::new(r"^(a+)").unwrap();
io::Cursor::new(b"aaa\nbbb\nccc")
.lines()
.filter_map(|line| {
let ss = &line.unwrap()[..];
reg.captures(ss)
})
.map(|cap| cap[1].to_string())
.for_each(|x| println!("{}", x));
}

最佳答案

在你的映射闭包中,line 的类型是Result<String, _> ,这意味着它拥有 String .然而,reg.captures()返回一个值,该值包含对该字符串中切片的引用。函数不能返回对其拥有的值的引用,因为当函数返回时这些值将被删除,从而使引用无效。

由于您在 filter_map 之后立即创建了一个新的自有值无论如何,你可以把那部分移到里面,这样引用就只在闭包中使用:

io::Cursor::new(b"aaa\nbbb\nccc")
.lines()
.filter_map(|line| {
let ss = &line.unwrap()[..];
reg.captures(ss).map(|cap| cap[1].to_string())
})
.for_each(|x| println!("{}", x));

关于rust - 如何避免 filter_map() 在 Rust 中给出错误 "returns a value referencing data owned by the current function"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64621198/

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