【发布时间】:2021-04-30 12:27:15
【问题描述】:
我正在处理book,但我不明白为什么这个函数不能编译:
pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
contents
.lines() // Fetch an iterator for each line in `contents`
.map(|x| x.to_lowercase()) // (x is now String) Convert each line to lowercase
.filter(|x| x.contains(query)) // Filter out lines that do not contain query
.map(|x| x.trim()) // Eliminate extra whitespace
.collect() // Consume iterator and produce Vec<&str>
}
如果没有to_lowercase() 行,它将运行,我猜这是因为这将返回String 而不是&str,我们需要在最后输出。但是,当我将转换替换回 &str 时,例如:
// -- snip --
.map(|x| x.to_lowercase().to_str())
// -- snip --
这表明正在引用一个临时值。我假设是因为&str 引用了String,当String 被释放时,它也会使我的&str 无效。
闭包不是处理这个问题的好方法,我应该把它分解成不同的语句吗?
【问题讨论】:
-
最终结果是否需要小写?还是只需要查询匹配?
-
哦,这很好。在我的情况下,我想单独留下内容,并将其用于查询匹配。不过,我会对任一方向的答案感兴趣。
标签: rust closures borrow-checker ownership borrowing