繁体   English   中英

调用 tokio::spawn 时如何解决“特征绑定 `[closure]: tokio::prelude::Future` 不满足”?

[英]How do I solve “the trait bound `[closure]: tokio::prelude::Future` is not satisfied” when calling tokio::spawn?

extern crate tokio; // 0.1.22

use tokio::io;
use tokio::net::TcpListener;
use tokio::prelude::*;

use bytes::Bytes; // 0.4.12

fn main() {
    let addr = "0.0.0.0:1502".parse().unwrap();
    let mut listener = TcpListener::bind(&addr).unwrap();

    let done = listener
        .incoming()
        .map_err(|e| println!("failed to accept socket; error = {:?}", e))
        .for_each(move |socket| {
            let process = move || {};

            tokio::spawn(process)
        });

    tokio::run(done);
    Ok(());

    tokio::run(done);
}
error[E0277]: the trait bound `[closure@src/main.rs:17:27: 17:37]: tokio::prelude::Future` is not satisfied
  --> src/main.rs:19:13
   |
19 |             tokio::spawn(process)
   |             ^^^^^^^^^^^^ the trait `tokio::prelude::Future` is not implemented for `[closure@src/main.rs:17:27: 17:37]`
   |
   = note: required by `tokio::spawn`

游乐场

请检查tokio::spawn的定义

pub fn spawn<F>(f: F) -> Spawn 
where
    F: Future<Item = (), Error = ()> + 'static + Send

它期望Future的实现作为它的参数。 您传递给tokio::spawn的闭包不是Future的实现。 Futures-rs 没有闭包,而是lazy

创建一个新的未来,最终将与提供的闭包创建的相同。

简单地说,一个lazy的未来持有一个要执行的闭包。 这发生在 executor 首次执行poll时(在这种情况下,您使用的是 Tokio executor)。

如果你用lazy包装你的闭包,你的代码将按预期工作。

extern crate tokio; // 0.1.22

use tokio::net::TcpListener;
use tokio::prelude::*;

fn main() {
    let addr = "0.0.0.0:1502".parse().unwrap();
    let listener = TcpListener::bind(&addr).unwrap();

    let done = listener
        .incoming()
        .map_err(|e| println!("failed to accept socket; error = {:?}", e))
        .for_each(move |_socket| {
            let process = futures::future::lazy(move || {
                println!("My closure executed at future");
                Ok(())
            });

            tokio::spawn(process)
        });

    tokio::run(done);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM