Почему при использовании .await или в макросе, подобном `join!`, Я получаю сообщение "Будущее не удовлетворено"? - PullRequest
0 голосов
/ 19 марта 2020

Я работаю над асинхронной программой Rust, но макрос join! не работает. .await тоже не работает. Где моя проблема?

Я видел примеры в официальной документации .

Это также не работает:

#[async_std::main]
async fn main() {}

Я не сделал Я не использую Tokio или Hyper, потому что это простая программа.

use async_std::task;
use futures::executor::block_on;
use futures::join;
use futures::stream::{FuturesUnordered, StreamExt};
use rand::distributions::{Distribution, Uniform};
use std::thread;
use std::time::{Duration, Instant};

fn main() {
    let start = "bename Allah";
    println!("{}", start);

    fn fibonacci(n: u64) -> u64 {
        if n <= 1 {
            return 1;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }

    fn fib(n: u64) {
        println!("Its : {}", fibonacci(n));
    }

    async fn calculate() {
        let do1 = fib(45);
        let do2 = fib(20);

        join!(do1, do2);
    }

    calculate();
    //i used block_on(calculate()) but got same error :(
}
[dependencies]
futures = "0.3.1"
rand = "0.7"
async-std = { version = "1.2", features = ["attributes"] }
surf = "1.0"

Я получаю эту ошибку:

error[E0277]: the trait bound `(): core::future::future::Future` is not satisfied
  --> src\main.rs:28:15
   |
28 |         join!(do1,do2);
   |               ^^^ the trait `core::future::future::Future` is not implemented for `()`
   | 
  ::: C:\Users\Mahdi\.cargo\registry\src\github.com-1ecc6299db9ec823\futures-util-0.3.4\src\future\maybe_done.rs:42:24
   |
42 | pub fn maybe_done<Fut: Future>(future: Fut) -> MaybeDone<Fut> {
   |                        ------ required by this bound in `futures_util::future::maybe_done::maybe_done`

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Ваша проблема может быть уменьшена до этого:

fn alpha() {}

async fn example() {
    alpha().await;
}
error[E0277]: the trait bound `(): std::future::Future` is not satisfied
  --> src/lib.rs:4:5
   |
4  |     alpha().await;
   |     ^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `()`

Вы пытаетесь ожидать чего-то, что не реализует Future. Тип возврата alpha - (). Скорее всего, вы намеревались сделать свои функции async:

async fn alpha() {}
//^^^

async fn example() {
    alpha().await;
}

См. Также:

Стоит отметить, что вычисление числа Фибоначчи не подходит для асинхронной работы. См. Также:

0 голосов
/ 03 апреля 2020

Шепмастер так прав! я нашел новое решение, чтобы сделать это правильно:

use std::thread;
fn main() {
let start = "bename Allah";
println!("{}", start);

fn fibonacci(n: u64) -> u64 {
    if n <= 1 {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

fn fib(n: u64) {
    println!("Its : {}", fibonacci(n));
}

fn calculate() {
    let do1 = thread::spawn (move || {
        fib(45);
    });
    let do2 = thread::spawn (move || {
        fib(20);
    });
    do1.join();
    do2.join();
}

calculate();

}
...