我试图通过克隆来复制闭包外部的字符串,但编译器告诉我 k 转义了闭包主体。
我以为克隆可以让我解决这个问题,但这不起作用。
知道我如何才能实现类似于下文描述的行为吗?我实际上正在尝试读取一个文件并在闭包中生成每一行,也许可以复制其中的一些。
fn copier(src: &Vec<&str>, mut closure: impl FnMut(&str) -> ()) {
for s in src {
closure(s);
}
}
fn main() {
let source: Vec::<&str> = vec!["aa", "bb"];
let mut newVec: Vec::<&str> = vec![];
copier(&source, |k| newVec.push(k.clone()));
println!("{:?}", newVec);
}
错误:
Standard Error
Compiling playground v0.0.1 (/playground)
error[E0521]: borrowed data escapes outside of closure
--> src/main.rs:10:25
|
9 | let mut newVec: Vec::<&str> = vec![];
| ---------- `newVec` declared here, outside of the closure body
10 | copier(&source, |k| newVec.push(k.clone()));
| - ^^^^^^^^^^^^^^^^^^^^^^ `k` escapes the closure body here
| |
| `k` is a reference that is only valid in the closure body
哦!谢谢@Masklinn!我复制的是参考资料,而不是内容。
这有助于我对内存管理的理解,我来自JS所以还有很长的路要走...
此外,我需要将 new_vec 包含的类型更改为 String。如果我理解得很好,我无法将 &str 推入其中,因为它引用的字符串(通过调用 to_owned 创建的)在闭包结束时被删除。
因此新创建的字符串需要移出其中。
更新的解决方案:
fn copier(src: &Vec<&str>, mut closure: impl FnMut(&str) -> ()) {
for s in src {
closure(s);
}
}
fn main() {
let source: Vec::<&str> = vec!["aa", "bb"];
let mut new_vec: Vec::<String> = vec![];
copier(&source, |k| new_vec.push(k.to_owned()));
println!("{:?}", new_vec);
}