Rust:终生超越匿名函数

标签 rust

我正在尝试使用函数 spawn 模拟异步执行但我无法编译下面的代码片段。

use std::thread::{spawn, JoinHandle};

fn main() {
    let data  = vec![String::from("some data"), String::from("some more data")];

    let doer = Doer{f: |x| {return x + " hello"} };

    let results: Vec<JoinHandle<String>> = data.iter()
        .map(|x| doer.apply_async(x.to_owned()))
        .collect();

    results.iter().for_each(|x| println!("{}", x.join().unwrap()));
}

struct Doer {
    f: fn(xs: String) -> String
}

impl Doer {
    fn apply(&self, datum: String) -> String {
        let f = &self.f;
        return f(datum);
    }

    fn apply_async(&self, datum: String) -> JoinHandle<String> {
        return spawn(move|| self.apply(datum));
    }
}

我有这样的错误 first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 25:5...
我不确定什么生命比匿名生命更长久。
任何的想法?

最佳答案

apply_async是一种需要 &self 的方法.这意味着 self是一个引用,仅保证在对 apply_async 的调用期间有效.闭包move || self.apply(datum)捕获 self ,生命周期和所有,这意味着它不是 'static .这就是为什么你不能调用 spawn在上面。

Doer工具Clone ,解决此问题的一种方法是克隆 *selfmove它进入封闭。

    fn apply_async(&self, datum: String) -> JoinHandle<String> {
        let s = self.clone();
        return spawn(move || s.apply(datum));
    }

如果您不想克隆整个 Doer ,你只能复制必要的部分,然后重新实现 applyapply_async , 例如:
    fn apply_async(&self, datum: String) -> JoinHandle<String> {
        let f = self.f;
        return spawn(move|| f(datum));
    }

关于Rust:终生超越匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60018994/

相关文章:

tcp - 如何从 TcpStream 逐行读取?

rust - 在枚举类型上调用通用方法

rust - 如何在文档测试中使用具有 `test` 属性的模块?

rust - 编译时检查编译器是否nightly

rust - 生命周期问题和实现克隆

types - 你如何在 Rust 中指定值约束?

rust - rust future -调整作为水槽的功能

random - 如何使用字符串或数字在 Rust 中为随机数生成器提供种子

rust - 移动盒装函数时为 "cannot move a value of type FnOnce"

rust - 创建内联静态值的方法