0

パラメータに応じて、オプションで将来を実行するか、何もしない関数があります。Box返される 2 つの先物、tokio::prelude::future::Done<Item=(), Error=()>すぐに に解決されるOk(())a と、tokio::timer::Delay使用しているand_thenaを前後に配置して、 と のmap_err両方を に変換しようItemErrorしました()。で先物を実行しようとすると、これはうまくいかないようですtokio::run

extern crate tokio;

use std::time::{Duration, Instant};
use tokio::prelude::*;
use tokio::timer;

fn main() {
    tokio::run(foo(12));
}

fn foo(x: i32) -> Box<Future<Item = (), Error = ()>> {
    if x == 0 {
        Box::new(
            timer::Delay::new(Instant::now() + Duration::from_secs(5))
                .and_then(|_| Ok(()))
                .map_err(|_| ()),
        )
    } else {
        Box::new(future::result(Ok(())))
    }
}

これは、次のエラー メッセージでコンパイルに失敗します。

error[E0277]: the trait bound `tokio::prelude::Future<Error=(), Item=()>: std::marker::Send` is not satisfied
 --> src/main.rs:8:5
  |
8 |     tokio::run(foo(12));
  |     ^^^^^^^^^^ `tokio::prelude::Future<Error=(), Item=()>` cannot be sent between threads safely
  |
  = help: the trait `std::marker::Send` is not implemented for `tokio::prelude::Future<Error=(), Item=()>`
  = note: required because of the requirements on the impl of `std::marker::Send` for `std::ptr::Unique<tokio::prelude::Future<Error=(), Item=()>>`
  = note: required because it appears within the type `std::boxed::Box<tokio::prelude::Future<Error=(), Item=()>>`
  = note: required by `tokio::run`

Box<Future...>を実装していないようSendですが、私には意味がありません。Future私が返す型は両方の implementであるため、標準ライブラリの自動実装であるため、そうすべきだSendと私には思えます。ここで何が欠けていますか?Boximpl Send for Box<T> where T: Send

4

1 に答える 1