gpt4 book ai didi

rust - "explicit lifetime required"在盒装 future 使用引用变量

转载 作者:行者123 更新时间:2023-11-29 08:26:57 26 4
gpt4 key购买 nike

我正在尝试使用在 main() 中创建的结构,并将其传递给返回装箱的 Future 的函数。但是,我遇到了生命周期和借用问题,似乎无法彻底解决这个问题。

这是我的结构和函数:

extern crate futures; // 0.1.21
extern crate tokio_core; // 0.1.17

use futures::{future::ok, Future};

pub struct SomeStruct {
some_val: u32,
}

impl SomeStruct {
pub fn do_something(&self, value: u32) -> u32 {
// Do some work
return self.some_val + value;
}
}

fn main() {
let core = tokio_core::reactor::Core::new().unwrap();
let my_struct = SomeStruct { some_val: 10 };

let future = get_future(&my_struct);
core.run(future);

let future2 = get_future(&my_struct);
core.run(future2);
}

fn get_future(some_struct: &SomeStruct) -> Box<Future<Item = u32, Error = ()>> {
let fut = ok(20).and_then(|val| {
let result = some_struct.do_something(val);
ok(result)
});
Box::new(fut)
}

编译时出现如下错误:

error[E0621]: explicit lifetime required in the type of `some_struct`
--> src/main.rs:33:5
|
28 | fn get_future(some_struct: &SomeStruct) -> Box<Future<Item = u32, Error = ()>> {
| ----------- consider changing the type of `some_struct` to `&'static SomeStruct`
...
33 | Box::new(fut)
| ^^^^^^^^^^^^^ lifetime `'static` required

我想错误的发生是因为 SomeStructFuture 中使用并且可能在 main() 的范围之外使用,因此编译器要求我将生命周期更改为 'static。到目前为止,这是我尝试过的(未成功):

  • 按照编译器的建议将生命周期更改为 'static,这会在 main() 中产生借用问题。
  • 按照编译器的建议,通过添加 ok(20).and_then(move |val| { 来移动 val,这会在 的第二次调用中产生问题get_future().
  • 使用lazy_static crate 以将 SomeStruct 显式初始化为静态(如建议的 here ),但是我在尝试时遇到宏错误。

可以找到整个例子here .我省略了一些细节来创建一个最小的例子。使用 tokio-corefutures = "0.1" 时会出现问题。不幸的是,迁移到版本 "0.2" 不是一个选项,因为依赖于另一个库。

最佳答案

返回一个装箱的特征对象有一个默认绑定(bind)的'static。按照编译器的建议执行并提供明确的生命周期,但不是'static:

fn get_future<'a>(some_struct: &'a SomeStruct) -> Box<dyn Future<Item = u32, Error = ()> + 'a> {
let fut = future::ok(20).and_then(move |val| {
let result = some_struct.do_something(val);
future::ok(result)
});
Box::new(fut)
}

您还必须使用movesome_struct 的所有权转移到闭包并将core 更改为可变的。您还应该处理 core.run 导致的潜在错误。

对于提供的示例,您还可以返回 impl Future:

fn get_future<'a>(some_struct: &'a SomeStruct) -> impl Future<Item = u32, Error = ()> +'a {
future::ok(20).and_then(move |val| {
let result = some_struct.do_something(val);
future::ok(result)
})
}

另见:

关于rust - "explicit lifetime required"在盒装 future 使用引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50915147/

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