借用的数据逃脱了闭包(rust)

问题描述 投票:0回答:1

我试图通过克隆来复制闭包外部的字符串,但编译器告诉我 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
rust closures
1个回答
0
投票

哦!谢谢@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);
}
© www.soinside.com 2019 - 2024. All rights reserved.